2015-11-14 8 views

risposta

33

E 'perché i dati esistenti non hanno alcun valore in quella nuova colonna, vale a dire null. Causando così detto errore Quando si aggiunge una colonna non annullabile, è necessario decidere quale valore dare dati già esistenti


Va bene, i dati esistenti devono solo avere "lorem ipsum" per questa nuova colonna allora. Ma come lo faccio? Non riesco ad AGGIORNARE perché la colonna non è ancora lì.

Utilizzare il server_default arg:

op.add_column('mytable', sa.Column(
    'mycolumn', 
    sa.String(), 
    nullable=False, 
    server_default='lorem ipsum', # <--- add this 
)) 

Ma, ma, non voglio che avesse valore predefinito

Inseriscila poi usando op.alter_column('mytable', 'mycolumn', server_default=None)

Ad es la funzione upgrade() sarebbe:

def upgrade(): 
    op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False, server_default='lorem ipsum')) 
    op.alter_column('mytable', 'mycolumn', server_default=None) 
+0

Non funziona ancora con il database Postgres. –

12

Un'alternativa a @ risposta di Ron è quello di fare il contrario, e modificare i dati prima aggiungere il vincolo:

def upgrade(): 
    op.add_column('my_table', sa.Column('my_column', sa.String())) 
    op.execute('UPDATE my_table SET my_column=my_other_column') 
    op.alter_column('my_table', 'my_column', nullable=False) 

Sembra più pulito e più potente per me , ma stai scrivendo SQL :-).

+0

quando si utilizza il backend MySQL, l'ultima riga deve essere op.alter_column ('my_table', 'my_column', existing_type = sa.String(), nullable = False), altrimenti si otterrà un alembic.util.exc.CommandError (altro su questo [qui] (http://alembic.zzzcomputing.com/en/latest/ops.html#alembic.operations.Operations.alter_column)) –

Problemi correlati