2014-01-07 57 views
15

我已经用SQLAlchemy设置了本地Postgres数据库,无法提交我的第一个条目。我继续得到这个错误...无法完成烧瓶迁移

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

看起来这些字段与数据库中的字段不匹配。我试图用烧瓶迁移迁移,但是,当我运行$ python app.py db migrate我得到这个错误...

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

这可能是最好删除一切,从头开始,因为它似乎我已经搞砸我的数据库设置和/或迁移,但我不知道如何。

UPDATE:数据库现在已经开始工作(我放弃并重新创建了它)。然而,我仍然遇到同样的错误,试图运行迁移,事实证明“没有这样的修订”39408d6b248d“是指从一个不相关的项目迁移。我重新安装了烧瓶迁移但同样的错误。

+1

你是否找到了解决这个问题呢?我有同样的问题,但我认为在我的情况下,问题是我想插入记录在刚刚在变更集中创建的表中。我假设交易必须先关闭,以便表格可用... – orange

回答

1

假设你已经检查数据库使用PSQL或pgAdmin的存在,这个错误通常意味着它说什么这可能是由于两种:

+0

数据库正在运行,但仍然存在重新迁移的问题。详情如上。 –

7

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

+0

我刚刚将数据库中的'version_num'值更新为我需要的版本。但我永远不会猜测我的数据库检查迁移历史......谢谢':)' – Renier

+0

你能详细说明你“需要它”吗?我面临同样的问题 –

14

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

+0

这一个应该被接受! – selfboot

0

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

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

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

1

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

因此,更好地从数据库中删除该表alembic_version并做

$ python app.py db history得到迁移,比如说新的头,5301c31377f2

现在运行$ python app.py db stamp 5301c31377f2让蒸馏器知道,这是你的迁移头(其中获​​得存储在表alembic_version)。

6

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

为什么你得到这个的原因是bc alembic对你目前的状态感到困惑。它假设你应该在版本39408d6b248d中,但是然后决定该修订是无效的。

对此展开调查,让我们找出哪个版本考虑由蒸馏器有效,运行这个命令:

alembic history --verbose 

你会得到所有以前的版本(注列表:这是一个好主意附加信息每个修订旁边..想想它作为一个很好的混帐提交信息)

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'; 

,现在运行的蒸馏器电流恢复

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

完成。

0

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

我发现烧瓶迁移文档中的解决方案: https://flask-migrate.readthedocs.org/en/latest/

迁移脚本需要进行检查和编辑,如蒸馏器 当前不检测每一个改变您对您的模型。在 特别是,Alembic目前无法检测索引。一旦完成 ,还需要将迁移脚本添加到版本 控件中。

那么你可以申请迁移到数据库:

python manage.py db upgrade 

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

0

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

+0

(欢迎来到SO!)你的回答给[Cello Hsueh's](https://stackoverflow.com/a/24473808/3789665)增加了什么? – greybeard