2014-12-18 349 views
4

我在使用Flask,Alembic和PostgreSQL和SQLAlchemy。我有一個現有的表location_messagescampaign_id。這是最初創建模型的代碼如何通過SQLAlchemy在現有表列添加外鍵約束?

campaign_id = db.Column(db.Integer) 

我要外鍵添加到它,所以我更新了

campaign_id = db.Column(db.Integer, db.ForeignKey('campaigns.id')) 

模型我跑了revision --autogenerate,但它並沒有創造任何東西 - 所以我一直在尋找docs,但我無法理解我的使用語法。對於它的價值,從頭開始創建表在蒸餾器(滴加完畢)是

op.create_table('location_messages', 
[...] 
sa.Column('campaign_id', sa.Integer(), nullable=True), 
sa.ForeignKeyConstraint(['campaign_id'], ['campaigns.id'],), 
sa.PrimaryKeyConstraint('id') 
) 

但對我的生活,我不能找到一種方法來對現有表做到這一點。有沒有辦法只是得到一個表的實例,並將ForeignKeyConstraint分配給列?

回答

8

您正在尋找的Alembic產品是create_foreign_key

op.create_foreign_key(
    'fk_location_message_campaign', 
    'location_messages', 'campaigns', 
    ['campaign_id'], ['id'], 
) 

建議您使用automatic constraint naming,這樣就可以通過None的名稱,而不是手動命名。

+0

在某些情況下,例如,當alembic遷移需要與SQLAlchemy模型保持同步時,最好使用明確的約束命名。否則,結果可能取決於某個'table_ibfk_#'編號,並刪除特定的FK問題。 – 2017-11-28 10:24:44