Flask-Migrate `db upgrade` 失败 "relation does not exist"
Flask-Migrate `db upgrade` fails with "relation does not exist"
我正在 flask-app 的开发环境中工作,其 Postgres 10 数据库大约有 80 tables。有很多关系和 ForeignKeyConstraints 将它们联网在一起。
Flask-Migrate 运行良好。我用 ~80 tables 引导并迁移到这一点。但是,我想测试一些新的脚本来为数据库 tables 做种,并且认为最快的方法是删除数据库并使用 Flask-Migrate 重新启动它。
在这个过程中,迁移文件夹被删除了,所以我重新开始db init
。然后运行db migrate
。我在迁移脚本中手动修复了一些导入。最后,我运行db upgrade
。
但是,现在我的迁移脚本中有所有这 80 个 create_table
命令,当我 运行 db_upgrade
时,我收到一个错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "items" does not exist
如果子 table 的顺序不低于迁移文件中父 table 的顺序,我会收到每个具有 ForeignKeyConstraint 的子 table 的错误。
但是,来自 db migrate
的自动生成的脚本有 table 按字母顺序排序,按 table 名称排序。
参考文档,我没有看到提到排序顺序的重要性。
最重要的是,我似乎要么被迫编写一个脚本来按照父 table 在子 table 之上的顺序对所有这些 table 进行排序.或者,就像拼图一样剪切和粘贴,直到所有 table 都按要求的顺序排列。
我错过了什么?使用 Flask-Migrate 或 Alembic 有更简单的方法吗?
经过研究,似乎 flask-migrate and/or Alembic 没有任何内置方法来解决此排序顺序问题。我通过按确保父 table 在迁移文件中的子 table 之上的顺序剪切和粘贴 tables 来修复它。
我在使用 flask-sqlalchemy 和 flask-migrate 时遇到了一些问题,我使用 python interactive shell.
解决了它
>>> from yourapp import db, create_app
>>> db.create_all(app=create_app())
检查 this link 以获取更多信息。
编码愉快...
我自己也遇到过,找不到更好的and/or官方答案。
我的方法是将 table 创建与外键约束的创建分开:
- 编辑 Alembic 的自动生成的迁移脚本:在每个 table 创建操作中,删除所有创建外键约束的行
- 运行 Alembic 的升级命令(创建 tables,当然减去 FK 约束)
- 运行 Alembic 的迁移命令(创建了额外的迁移脚本,添加了所有 FK 约束)
- 运行 Alembic 的升级命令(FK 约束添加到 tables)
我正在 flask-app 的开发环境中工作,其 Postgres 10 数据库大约有 80 tables。有很多关系和 ForeignKeyConstraints 将它们联网在一起。
Flask-Migrate 运行良好。我用 ~80 tables 引导并迁移到这一点。但是,我想测试一些新的脚本来为数据库 tables 做种,并且认为最快的方法是删除数据库并使用 Flask-Migrate 重新启动它。
在这个过程中,迁移文件夹被删除了,所以我重新开始db init
。然后运行db migrate
。我在迁移脚本中手动修复了一些导入。最后,我运行db upgrade
。
但是,现在我的迁移脚本中有所有这 80 个 create_table
命令,当我 运行 db_upgrade
时,我收到一个错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "items" does not exist
如果子 table 的顺序不低于迁移文件中父 table 的顺序,我会收到每个具有 ForeignKeyConstraint 的子 table 的错误。
但是,来自 db migrate
的自动生成的脚本有 table 按字母顺序排序,按 table 名称排序。
参考文档,我没有看到提到排序顺序的重要性。
最重要的是,我似乎要么被迫编写一个脚本来按照父 table 在子 table 之上的顺序对所有这些 table 进行排序.或者,就像拼图一样剪切和粘贴,直到所有 table 都按要求的顺序排列。
我错过了什么?使用 Flask-Migrate 或 Alembic 有更简单的方法吗?
经过研究,似乎 flask-migrate and/or Alembic 没有任何内置方法来解决此排序顺序问题。我通过按确保父 table 在迁移文件中的子 table 之上的顺序剪切和粘贴 tables 来修复它。
我在使用 flask-sqlalchemy 和 flask-migrate 时遇到了一些问题,我使用 python interactive shell.
解决了它>>> from yourapp import db, create_app
>>> db.create_all(app=create_app())
检查 this link 以获取更多信息。
编码愉快...
我自己也遇到过,找不到更好的and/or官方答案。
我的方法是将 table 创建与外键约束的创建分开:
- 编辑 Alembic 的自动生成的迁移脚本:在每个 table 创建操作中,删除所有创建外键约束的行
- 运行 Alembic 的升级命令(创建 tables,当然减去 FK 约束)
- 运行 Alembic 的迁移命令(创建了额外的迁移脚本,添加了所有 FK 约束)
- 运行 Alembic 的升级命令(FK 约束添加到 tables)