Ho bisogno di modificare i dati durante un aggiornamento Alembic.Come si eseguono inserimenti e aggiornamenti in uno script di aggiornamento di Alembic?
Al momento ho un tavolo 'giocatori' in una prima revisione:
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')
)
voglio introdurre un tavolo 'squadre'. Ho creato un seconda revisione:
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))
vorrei che la seconda migrazione di aggiungere anche i seguenti dati:
Popola tavolo squadre:
INSERT INTO teams (name) SELECT DISTINCT team FROM players;
Aggiornamento giocatori. team_id in base al nome players.team:
UPDATE players AS p JOIN teams AS t SET p.team_id = t.id WHERE p.team = t.name;
Come si eseguono inserimenti e aggiornamenti all'interno dello script di aggiornamento?
Cosa potrebbe impedirti di utilizzare i modelli di applicazione esistenti all'interno di una migrazione alambicco? –
@AndriyYurchuk il problema è che i modelli rappresentano lo * stato corrente * del database, mentre le migrazioni rappresentano * passaggi lungo la strada *. Ma il tuo database potrebbe trovarsi in qualsiasi stato lungo quel percorso, quindi i modelli potrebbero non essere ancora sincronizzati con il database. A meno che tu non sia * molto * attento (e questo mi ha morso in modi imprevedibili), l'uso diretto dei modelli causerà problemi con colonne mancanti, dati non validi, ecc. È più chiaro indicare esplicitamente quali colonne e modelli utilizzerai nel migrazione. – davidism
@AndriyYurchuk Evito di utilizzare i modelli a meno che non abbia intenzione di eseguire una migrazione dei dati complessa che implica l'esecuzione di query tra le relazioni. Per migrazioni semplici, c'è sempre "op.execute" a patto che tu voglia scrivere direttamente SQL. – davidism