【问题标题】:Alembic not generating correct changesAlembic 没有产生正确的变化
【发布时间】:2017-04-30 06:38:03
【问题描述】:

我正在使用Flask-Migrate==2.0.0。它没有正确检测到更改。每次我运行python manage db migrate 时,它都会为所有模型生成一个脚本,尽管它们已在以前的修订版中成功添加。我在表中添加了两个新列,迁移修订应该只有这两个新列,而不是所有表都添加到其中。我有什么遗漏吗?

编辑 1

这是正在发生的事情。 我将 Flask_Migrate 添加到我的项目中。

python manage db init
python manage db migrate
python manage db upgrade

Flask-Migrate 生成的模型表以及带有修订的 alembic_version 表

985efbf37786

在这之后我做了一些改变。我在一张表中添加了两个新列并再次运行该命令

python manage db migrate

它生成了新的修订版

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'
)

第二个修订版也包含完全相同的代码。我不明白为什么它已经生成了。

我用谷歌搜索了一下,我的问题看起来与https://github.com/miguelgrinberg/Flask-Migrate/issues/93 完全一样,但我没有使用 oracle DB。我正在使用 Postgresql。另外我不知道它是否有任何影响,但我没有在默认公共架构中创建我的表,而是创建两个新架构(schema_a 和 schema_b),因为我有很多表(大约 100 个)。所以只是安排他们。

编辑 2

第一个问题似乎已经通过添加解决了

include_schemas=True

在 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

我尝试为每个外键约束添加名称,但这没有任何效果。

【问题讨论】:

标签: postgresql flask flask-sqlalchemy alembic flask-migrate


【解决方案1】:

将 search_path 设置为 public 解决了这个问题。我一直认为,除了在每个模型上显式设置架构信息外,我们还需要在 search_path 上添加这些架构。我错了。一旦在每个模型上明确定义了模式,就不需要更改 postgresql search_path。

搜索路径意味着反射的外键定义不会 匹配您模型中的内容。这仅适用于外键 因为 Postgresql 就是这样做的。通读 http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#remote-schema-table-introspection-and-postgresql-search-path 为背景。 - 迈克尔·拜尔

【讨论】:

    【解决方案2】:

    感谢您在解决问题后回来并提供反馈。在使用postgres时,我为同样的问题悲伤了 2 个小时

    顺便说一句,我想指出您必须在块 context.configure 中包含 include_schemas 选项,如下所示:

    context.configure(connection=connection,
                      target_metadata=target_metadata,
                      include_schemas=True,
                      process_revision_directives=process_revision_directives,
                      **current_app.extensions['migrate'].configure_args)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2016-01-09
      相关资源
      最近更新 更多