18

我已经使用 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 但同样的错误。

4

8 回答 8

22

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

于 2014-06-29T06:50:44.963 回答
7

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

于 2014-01-31T14:52:45.447 回答
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 上的值:

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

现在运行 alembic current 返回

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

完毕。

于 2015-08-04T09:50:10.893 回答
3

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

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

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

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

于 2015-06-23T09:56:43.610 回答
1

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

  • 未连接到正确的数据库实例(检查您的数据库 url:主机/端口和数据库名称)
  • 未正确配置 SQLAlchemy(请参阅:SQLAlchemy create_all() 不创建表
于 2014-01-08T00:49:58.843 回答
0

I got the same error yesterday, for my case the revision number '39408d6b248d' is due to your previous migration upgrade actions, each time your ran upgrade script then an Alembic version will be generated and stored in data.sqlite.

you must have done any upgrade which generated above '39408d6b248d', but then you deleted whole migrations/ directory and removed all upgrade scripts. The database e.g. data.sqlite still stores '39408d6b248d' but there aren't according migration script exists.

for my solution I delete whole Alembic versions in database and did all upgrades from scratch.

于 2015-03-17T09:46:17.770 回答
0

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

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

迁移脚本需要审查和编辑,因为 Alembic 目前无法检测到您对模型所做的每一项更改。特别是,Alembic 目前无法检测索引。完成后,还需要将迁移脚本添加到版本控制中。

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

python manage.py db upgrade

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

于 2015-11-10T12:16:48.110 回答
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

于 2017-08-24T09:20:33.103 回答