2016-12-14 105 views
0

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

编辑1

这是发生了什么。 我在我的项目中添加了Flask_Migrate。

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

瓶,迁移生成的模型加上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数据库。我正在使用Postgresql。此外,我不知道它是否有任何作用,但我不是在默认公共架构中创建我的表,而是创建两个新架构(schema_a和schema_b),因为我有很多表(大约100)。所以只是为了安排他们。

EDIT 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 

我曾尝试添加名称到每个外键约束,但不具有任何影响。

+1

有你看到这个讨论关于你的问题? https://groups.google.com/forum/#!topic/sqlalchemy-alembic/FA8wpmPJc7U – Miguel

回答

0

将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 为背景。 - Michael Bayer

0

感谢您回复并在解决问题后提供您的反馈。我有2小时同一个问题的悲痛,同时使用postgres

顺便说一句,我想指出的是,你必须包括在块context.configureinclude_schemas选项,就像这样:

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