2015-11-14 109 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)) –