2015-11-14 114 views

回答

33

這是因爲現有數據對新列沒有值,即null。從而導致所述錯誤。當添加非空列,你必須決定什麼樣的價值給已經存在的數據


好吧,現有的數據應該只是有「Lorem存有」這個新列呢。但我該怎麼做?我無法更新,因爲該列尚未存在。

使用server_default ARG:

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

可是,可是,我不希望它有默認值

放下它後使用op.alter_column('mytable', 'mycolumn', server_default=None)

例如您upgrade()職能是:

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數據庫。 –

12

到@羅恩的回答是做相反,修改數據之前添加約束的選擇:

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) 

似乎更清潔,更強大,我,但是你正在寫SQL :-)。

+0

當使用MySQL後端時,最後一行應該是op.alter_column('my_table','my_column',existing_type = sa.String(),nullable = False),否則你會得到一個alembic.util.exc.CommandError(更多關於[這裏](http://alembic.zzzcomputing.com/en/latest/ops.html#alembic.operations.Operations.alter_column)) –