Alembic没有生成正确的更改

时间:2016-12-14 19:46:52

标签: 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

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

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

我用Google搜索了一下,我的问题看起来与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

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

2 个答案:

答案 0 :(得分:2)

感谢您在解决问题后回来并提供反馈。使用postgres

时,我对同样的问题感到悲伤2小时

顺便说一句,我想指出你必须在include_schemas区块中加入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)

答案 1 :(得分: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   为背景。 - 迈克尔拜耳