我正在向现有表中添加一列。这个新列是nullable=False
。Alembic:IntegrityError:“列包含空值”时添加不可空列
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
当我运行迁移,它抱怨:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
我正在向现有表中添加一列。这个新列是nullable=False
。Alembic:IntegrityError:“列包含空值”时添加不可空列
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
当我运行迁移,它抱怨:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
这是因为现有数据对新列没有值,即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)
到@罗恩的回答是做相反,修改数据之前添加约束的选择:
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 :-)。
当使用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)) –
它仍然不适用于Postgres数据库。 –