【问题标题】:Cannot complete Flask-Migration无法完成 Flask 迁移
【发布时间】:2014-01-25 05:24:07
【问题描述】:

我已经使用 SQLAlchemy 设置了一个本地 Postgres 数据库,但无法提交我的第一个条目。我不断收到此错误...

ProgrammingError: (ProgrammingError) relation "user" does not exist
LINE 1: INSERT INTO "user" (name, email, facebook_id, facebook_token...

这些字段似乎与数据库中的字段不匹配。我正在尝试使用 flask-migrate 进行迁移,但是当我运行 $ python app.py db migrate 时出现此错误...

raise util.CommandError("No such revision '%s'" % id_)
alembic.util.CommandError: No such revision '39408d6b248d'

最好删除所有内容并从头开始,因为我似乎搞砸了我的数据库设置和/或迁移,但我不知道该怎么做。

更新:数据库现在已经开始工作(我删除并重新创建了它)。但是,我在尝试运行迁移时仍然遇到同样的错误,事实证明“没有这样的修订版 '39408d6b248d' 是指从不相关的项目迁移。我重新安装了 flask-migrate 但同样的错误。

【问题讨论】:

  • 你有没有找到解决这个问题的方法?我遇到了同样的问题,但我认为在我的情况下,问题是我想在刚刚在变更集中创建的表中插入记录。我认为必须先关闭事务才能使表可用...

标签: python postgresql sqlalchemy-migrate flask-migrate


【解决方案1】:

flask-migrate 将在您的数据库中创建一个名为“alembic_version”的表。
因此,您应该删除此表并删除项目中的迁移文件夹。
然后再次使用$ python app.py db init...
我认为$ python app.py db migrate 可以正常工作。

【讨论】:

    【解决方案2】:

    Alembic 将迁移历史记录保存在您的数据库中,这就是为什么它仍然可以识别那里还有另一个修订版本。我将我的项目保留在 Heroku 上,因此我能够执行 heroku pg:pull ... 以获得数据库的新副本。在此之前,您必须删除本地数据库。如果你不想放弃你的本地人,我认为放弃桌子也应该工作。我使用 PG Commander 作为 GUI 工具来快速浏览我的数据库。

    【讨论】:

    • 我刚刚将数据库中的version_num 值更新为我需要的版本。但我永远不会猜到会检查我的数据库中的迁移历史......谢谢:)
    • 你能详细说明你“需要它是什么”吗?我也面临同样的问题
    【解决方案3】:

    第一步是运行这个命令 alembic current 你应该得到一个如上所述的错误(目标是确保这个命令返回一个有效的响应)。

    你得到这个的原因是 bc alembic 对你当前的状态感到困惑。它假设你应该处于修订版 39408d6b248d 但随后决定该修订版无效。

    要对此进行调查,让我们找出哪些修订被 alembic 认为是有效的,运行以下命令:

    alembic history --verbose
    

    您将获得所有先前修订的列表(注意:最好在每个修订旁边附加一条消息。将其视为一个好的 git 提交消息)

    Rev: 594cc72f56fd (head)
    Parent: 262f40e28682
    Path: ***************
    
        adjust context_id in log table so that it is a substring of the object_id
    
        Revision ID: 594cc72f56fd
        Revises: 262f40e28682
        Create Date: 2015-07-22 14:31:52.424862
    
    Rev: 262f40e28682
    Parent: 1dc902bd1c2
    Path: ***************
    
        add context_id column to log table
    
        Revision ID: 262f40e28682
        Revises: 1dc902bd1c2
        Create Date: 2015-07-22 11:05:37.654553
    
    Rev: 1dc902bd1c2
    Parent: <base>
    Path: ***************
    
        Initial database setup
    
        Revision ID: 1dc902bd1c2
        Revises: 
        Create Date: 2015-07-06 09:55:11.439330
    

    上述修订版中显然不存在修订版39408d6b248d。此修订版本存储在数据库中的 alembic_table 中。您可以通过转到您的 dbase 并运行来验证:

    $ select * from alembic_version;
     version_num  
    --------------
     57ac999dcaa7
    

    所以现在您应该查看数据库的状态,看看它与上面输出的修订版相比在哪里适合:

    在我的情况下,通过查看我的 dbase,很明显我现在所处的版本是什么。即 dbase 已设置,但尚未包含其他版本。

    所以现在我用我从上面的历史命令中找到的值替换 dbase 上的值:

    vibereel=> update alembic_version set version_num = '1dc902bd1c2';
    

    现在运行 alembic current 返回

    INFO  [alembic.migration] Context impl PostgresqlImpl.
    INFO  [alembic.migration] Will assume transactional DDL.
    1dc902bd1c2
    

    完成。

    【讨论】:

      【解决方案4】:

      这意味着您的数据库的表alembic_version中的条目是“39408d6b248d”,并且在迁移文件夹中没有与之相关的迁移文件(默认为migrations/versions)。

      所以最好从你的数据库中删除表 alembic_version 并执行

      $ python app.py db history 获取新的迁移负责人,例如 5301c31377f2

      现在运行 $ python app.py db stamp 5301c31377f2 让 alembic 知道它是您的迁移头(存储在表 alembic_version 中)。

      【讨论】:

        【解决方案5】:

        假设您已经使用 psql 或 pgAdmin 检查了数据库是否存在,这个错误通常意味着它所说的内容。这可能是由于:

        【讨论】:

        • 数据库现在正在工作,但重新迁移仍然存在问题。详情在上面。
        【解决方案6】:

        我昨天遇到了同样的错误,就我而言,修订号“39408d6b248d”是由于您之前的迁移升级操作,每次您运行升级脚本时,都会生成一个 Alembic 版本并将其存储在 data.sqlite 中。

        您必须完成任何在“39408d6b248d”以上生成的升级,但随后您删除了整个迁移/目录并删除了所有升级脚本。数据库例如data.sqlite 仍然存储 '39408d6b248d' 但不存在相应的迁移脚本。

        对于我的解决方案,我删除了数据库中的整个 Alembic 版本,并从头开始进行所有升级。

        【讨论】:

          【解决方案7】:

          我遇到了类似的问题。执行 python manage.py db migrate 命令后,没有创建数据库表,数据库中只有一个 alembic 表。

          我在烧瓶迁移文档中找到了解决方案: https://flask-migrate.readthedocs.org/en/latest/

          迁移脚本需要审核和编辑,如 Alembic 目前无法检测到您对模型所做的每一项更改。在 特别是,Alembic 目前无法检测索引。一次 敲定了,迁移脚本也需要添加到版本中 控制。

          然后您可以将迁移应用到数据库:

          python manage.py db upgrade
          

          此命令创建了表并应用了数据库迁移。

          【讨论】:

            【解决方案8】:

            我有同样的问题。根据 db 中 alembic_version 表中的版本,迁移操作正在 /migrations/versions 文件夹中查找已删除的版本。因此解决方案是删除 alembic_version 表: 如果您使用的是 sqlite, 1. 打开你的 xxx.sqlite 数据库文件。 sqlite3 xxx.sqlite 2. 查表 .tables 3.你会看到alembic_version,删除它 DROP TABLE alembic_version

            【讨论】:

            • (欢迎来到 SO!)您的回答对 Cello Hsueh's 有何补充?
            猜你喜欢
            • 2019-12-27
            • 1970-01-01
            • 2021-08-13
            • 2021-08-18
            • 1970-01-01
            • 2012-10-07
            • 1970-01-01
            • 2018-12-07
            • 2013-07-04
            相关资源
            最近更新 更多