2016-12-14 112 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)