【发布时间】:2020-01-04 21:40:01
【问题描述】:
我有一个非常简单和愚蠢的问题,但我不知道我错过了什么。基本上,按照我目前编写管理应用程序的方式,flask migrate 似乎总是创建一个绝对迁移,而不仅仅是一个从以前的架构迁移到当前架构的变更集。
例如,如果我删除我的迁移并旋转一个全新的数据库,然后我执行manage db migrate 然后manage db upgrade 所有工作。如果我随后对 db.Model 表进行更改,然后执行 manage db migrate,我不会收到错误消息。
但是,新的迁移脚本指向前一个,但不仅仅是将数据库从前一个模式状态获取到新模式所需的差异,而是从空模式开始的完整(绝对)迁移 - 如,它将尝试再次从头开始创建表(使用更改),而不仅仅是将更改应用于已创建的模式。也就是说,即使迁移与之前的迁移相关联,它也没有考虑到之前的迁移应用了什么。这意味着它们不能被链接,因为例如第二次迁移将尝试再次创建表,因此 manage db upgrade 在第二次调用时失败。
我的manage 应用如下所示:
from flask_migrate import Migrate, MigrateCommand
from src.common.db import db
from src.common.flaskery import global_flask_app, global_flask_manager
app = global_flask_app(__name__)
migrate = Migrate(app, db)
manager = global_flask_manager(__name__)
manager.add_command('db', MigrateCommand)
from src.db.models import *
def main():
manager.run()
if __name__ == '__main__':
main()
类似:Flask Migrate using different postgres schemas ( __table_args__ = {'schema': 'test_schema']})
【问题讨论】:
-
您使用的是什么数据库?有非默认模式的 Postgres 吗?
-
是的。我在
def upgrade()中添加op.execute("create schema data"),然后在def downgrade()部分中添加op.execute("drop schema data")。
标签: flask sqlalchemy flask-sqlalchemy alembic flask-migrate