Was*_*eem 2 postgresql flask flask-sqlalchemy alembic flask-migrate
我在用Flask-Migrate==2.0.0。它无法正确检测更改。每次我跑步python manage db migrate,它都会为所有模型生成一个脚本,尽管它们已在之前的版本中成功添加。我已向表中添加了两个新列,迁移修订版应该只有这两个新列,而不是所有表都添加到其中。我有什么遗漏的吗?
编辑1
这是正在发生的事情。我将 Flask_Migrate 添加到我的项目中。
python manage db init
python manage db migrate
python manage db upgrade
Run Code Online (Sandbox Code Playgroud)
Flask-Migrate 为模型生成的表以及具有修订版的 alembic_version 表
985efbf37786
之后我做了一些改变。我在其中一个表中添加了两个新列并再次运行命令
python manage db migrate
Run Code Online (Sandbox Code Playgroud)
它生成了新的修订版
934ba2ddbd44
但修订版不是仅添加这两个新列,而是包含所有表以及这两个新列的脚本。例如,在我的第一次修订中,我有这样的内容
op.create_table('forex_costs',
sa.Column('code', sa.String(), nullable=False),
sa.Column('country', sa.String(), nullable=False),
sa.Column('rate', sa.Numeric(), nullable=False),
sa.PrimaryKeyConstraint('code', 'country', name='forex_costs_id'),
schema='regis'
)
Run Code Online (Sandbox Code Playgroud)
第二个修订版也包含完全相同的代码。我不明白为什么它已经生成了。
我用谷歌搜索了一下,我的问题看起来完全像这个https://github.com/miguelgrinberg/Flask-Migrate/issues/93,但我没有使用oracle DB。我正在使用 Postgresql。另外我不知道它是否有任何影响,但我没有在默认公共架构中创建表,而是创建两个新架构(schema_a 和 schema_b),因为我有很多表(大约 100 个)。所以只是为了安排他们。
编辑2
第一个问题似乎通过添加解决了
include_schemas=真
在 env.py 中。
现在,新的迁移不会尝试再次创建已经存在的表,但它存在一些外键问题。每次我创建新的修订版时,它都会尝试删除已经存在的外键,然后尝试添加它们。日志看起来像这样
INFO [alembic.autogenerate.compare] Detected removed foreign key (post_id)(post_id) on table album_photos
INFO [alembic.autogenerate.compare] Detected removed foreign key (album_id)(album_id) on table album_photos
INFO [alembic.autogenerate.compare] Detected removed foreign key (user_id)(user_id) on table album_photos
INFO [alembic.autogenerate.compare] Detected added foreign key (album_id)(album_id) on table prodcat.album_photos
INFO [alembic.autogenerate.compare] Detected added foreign key (post_id)(post_id) on table prodcat.album_photos
INFO [alembic.autogenerate.compare] Detected added foreign key (user_id)(user_id) on table prodcat.album_photos
Run Code Online (Sandbox Code Playgroud)
我尝试为每个外键约束添加名称,但这没有任何效果。
小智 5
感谢您在解决问题后回来并提供反馈。我在使用时对同样的问题感到悲伤 2 小时postgres
顺便说一句,我想指出,您必须include_schemas在 block 中包含该选项context.configure,如下所示:
context.configure(connection=connection,
target_metadata=target_metadata,
include_schemas=True,
process_revision_directives=process_revision_directives,
**current_app.extensions['migrate'].configure_args)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4511 次 |
| 最近记录: |