2015-11-14 28 views
20

eklerken varolan bir tablonun bir sütun ekliyorum. Bu yeni sütun nullable=False. Ben göçü çalıştırdığınızdaAlembic: IntegrityError: "sütun null değerleri içerir" null olmayan sütun

op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False)) 

, bu yakınır: Mevcut veriler bu yeni sütun üzerinde hiçbir değeri yoktur, çünkü

sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values 

cevap

33

O yani null olduğunu. Böylece bu hataya neden oluyor. null olmayan bir sütun eklerken, zaten var olan verileri


Tamam vermek ne değeri karar vermelidir, mevcut veriler tam o sırada bu yeni sütun için "lorem ipsum" olmalıdır. Ama nasıl yaparım? GÜNCELLEMEZ, çünkü sütun henüz yok.

server_default arg kullanın: sonradan

op.alter_column('mytable', 'mycolumn', server_default=None) kullanarak bunu Bırak varsayılan değerini

olmasını istemiyoruz,

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

Ama, ama Ör senin upgrade() fonksiyonu olacaktır:

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

Postgres veritabanıyla hala çalışmıyor. MySQL arka ucunu kullanırken –

12

Ron'un cevabı kısıtlama ekleme önce tersini yapmak, ve veriyi değiştirmektir @ bir alternatif:

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) 

bana daha temiz ve daha güçlü görünüyor ama sen SQL :-) yazıyorsun.

+0

, son satır op.alter_column ('my_table', 'my_column', varolan_türü = sa.String(), nullable = False) olmalıdır, aksi takdirde bir alembic.util.exc.CommandError (bunun hakkında [burada] (http://alembic.zzzcomputing.com/en/latest/ops.html#alembic.operations.Operations.alter_column)) –