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