无法完成Flask-Migration

Sur*_*oor 15 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...
Run Code Online (Sandbox Code Playgroud)

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

raise util.CommandError("No such revision '%s'" % id_)
alembic.util.CommandError: No such revision '39408d6b248d'
Run Code Online (Sandbox Code Playgroud)

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

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

小智 19

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


law*_*cko 7

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


abb*_*ood 7

要做的第一步是运行此命令, alembic current 您应该得到如上所述的错误(目标是确保此命令返回有效的响应).

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

调查这一点,让我们看看哪个版本视为由蒸馏器有效,运行以下命令:

alembic history --verbose
Run Code Online (Sandbox Code Playgroud)

您将获得所有以前版本的列表(注意:在每个修订旁边附加消息是个好主意..将其视为一个好的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
Run Code Online (Sandbox Code Playgroud)

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

$ select * from alembic_version;
 version_num  
--------------
 57ac999dcaa7
Run Code Online (Sandbox Code Playgroud)

所以现在你应该检查你的数据库的状态,看看它适合上面输出的修订版:

在我的情况下,通过戳我的dbase,很明显我现在正在修改哪个...这是dbase已经设置,但其他修订尚未包括在内.

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

vibereel=> update alembic_version set version_num = '1dc902bd1c2';
Run Code Online (Sandbox Code Playgroud)

现在运行alembic当前返回

INFO  [alembic.migration] Context impl PostgresqlImpl.
INFO  [alembic.migration] Will assume transactional DDL.
1dc902bd1c2
Run Code Online (Sandbox Code Playgroud)

完成.


Dmi*_*ing 1

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

  • 未连接到正确的数据库实例(检查您的数据库网址:主机/端口和数据库名称)
  • 未正确配置 SQLAlchemy(请参阅:SQLAlchemy create_all() 不创建表