无法完成Flask-Migration

时间:2014-01-07 13:40:34

标签: python postgresql sqlalchemy-migrate flask-migrate

我已经使用SQLAlchemy设置了一个本地Postgres DB,并且无法提交我的第一个条目。我继续犯这个错误...

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'

最好删除所有内容并从头开始,因为我似乎已经破坏了我的数据库设置和/或迁移,但我不知道如何。

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

8 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:7)

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

答案 2 :(得分:7)

要做的第一步是运行此命令 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上的值替换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

进行。

答案 3 :(得分:2)

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

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

$ python app.py db history获得新的迁移主管,比如5301c31377f2

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我昨天得到了同样的错误,对于我的情况,修订号是&#39; 39408d6b248d&#39;由于您之前的迁移升级操作,每次运行升级脚本时,都会生成Alembic版本并存储在data.sqlite中。

您必须完成上面生成的任何升级,然后删除了整个迁移/目录并删除了所有升级脚本。数据库,例如data.sqlite仍然存储&#39; 39408d6b248d&#39;但是根据迁移脚本不存在。

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

答案 6 :(得分:0)

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

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

  

迁移脚本需要像Alembic一样进行审核和编辑   目前未检测到您对模型所做的每项更改。在   特别是,Alembic目前无法检测索引。一旦   最终,迁移脚本也需要添加到版本中   控制。

     

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

{{1}}

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

答案 7 :(得分:0)

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