Flask-Migrate`db upgrade`失败,提示“不存在关系”

时间:2018-07-10 02:16:47

标签: flask sqlalchemy alembic flask-migrate

我正在一个开发环境中使用带有Postgres 10数据库(约80个表)的flask-app。有很多关系和ForeignKeyConstraints将所有这些联系在一起。

与Flask-Migrate配合正常。我用约80张表引导并迁移到了这一点。但是,我想测试一些新脚本来播种数据库表,并认为删除数据库并使用Flask-Migrate重新备份它是最快的。

在此过程中,迁移文件夹已删除,因此我刚开始使用db init重新开始。然后运行db migrate。我在迁移脚本中手动修复了一些导入。最后,我运行了db upgrade

但是,现在在迁移脚本中使用所有这80条create_table命令时,当我运行db_upgrade时,会收到错误消息:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "items" does not exist

如果子表的顺序不低于迁移文件中父表的顺序,我将收到每个具有ForeignKeyConstraint的子表的错误。

但是,来自db migrate的自动生成的脚本具有按字母顺序排序的表,并按表名排序。

参考文档,我看不到排序顺序的重要性。

最重要的是,似乎我要么被迫编写脚本,以将父表位于子表上方的顺序对所有这些表进行排序。否则,只需像拼图游戏一样剪切和粘贴,直到所有桌子都按要求的顺序排列即可。

我想念什么?使用Flask-Migrate或Alembic有没有更简单的方法?

3 个答案:

答案 0 :(得分:0)

研究此问题后,似乎flask-migrate和/或Alembic没有任何内置方法来解决此排序顺序问题。我通过按照确保父表位于迁移文件中子表上方的顺序剪切和粘贴表来修复该问题。

答案 1 :(得分:0)

使用flask-sqlalchemy和flask-migrate时遇到一些问题,并且解决了使用python nutheel的问题。

>>> from yourapp import db, create_app
>>> db.create_all(app=create_app())

选中this link以获取更多信息。

快乐的编码...

答案 2 :(得分:0)

我自己遇到了这个问题,找不到更好的和/或正式的答案。

我的方法是将表的创建与外键约束的创建分开:

  • 编辑Alembic的自动生成的迁移脚本:在每个表创建操作中,删除所有创建外键约束的行
  • 运行Alembic的upgrade命令(创建表,当然要减去FK约束)
  • 运行Alembic的迁移命令(创建了其他迁移脚本,该脚本添加了所有FK约束)
  • 运行Alembic的升级命令(将FK约束添加到表中)