我需要在Alembic升級過程中更改數據。如何在Alembic升級腳本中執行插入和更新?
我現在有一個「玩家」表中的第一修訂:
def upgrade():
op.create_table('player',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.Unicode(length=200), nullable=False),
sa.Column('position', sa.Unicode(length=200), nullable=True),
sa.Column('team', sa.Unicode(length=100), nullable=True)
sa.PrimaryKeyConstraint('id')
)
我想介紹一個「團隊」表。我創建了一個第二次修訂:
def upgrade():
op.create_table('teams',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=80), nullable=False)
)
op.add_column('players', sa.Column('team_id', sa.Integer(), nullable=False))
我想第二個遷移,還添加了以下數據:
填充球隊表:
INSERT INTO teams (name) SELECT DISTINCT team FROM players;
更新的球員。 team_id基於球員。隊名:
UPDATE players AS p JOIN teams AS t SET p.team_id = t.id WHERE p.team = t.name;
如何在升級腳本內執行插入和更新?
什麼可能阻止你使用alembic遷移中的現有應用程序模型? –
@AndriyYurchuk問題在於模型表示數據庫的*當前狀態*,而遷移表示沿途的*步驟*。但是您的數據庫可能處於該路徑的任何狀態,因此模型可能無法與數據庫同步。除非你非常小心(這使我以不可預知的方式咬人),直接使用這些模型會導致列缺失,數據無效等問題。清楚地明確說明你將使用哪些列和模型移民。 – davidism
@AndriyYurchuk我避免使用模型,除非我要做複雜的數據遷移,涉及查詢跨關係。對於簡單的遷移,只要你願意直接寫SQL,總是會有'op.execute'。 – davidism