烧瓶迁移"数据库升级"失败,"relation does not exist"



我正在一个flask应用程序的开发环境中工作,该应用程序具有大约80个表的Postgres 10数据库。有很多关系和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有更简单的方法吗?

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

我自己刚刚遇到过这种情况,找不到更好的和/或官方的答案。

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

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

我在使用flask sqlalchemy和flask migrate时遇到了一些问题,我使用python交互式shell解决了这些问题。

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

查看此链接以获取更多信息。

编码快乐。。。

最新更新