Alembic:IntegrityError:添加非可空列时“列包含空值”

时间:2015-11-14 06:13:29

标签: python sqlalchemy alembic

我正在向现有表添加列。这个新列是nullable=False

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

当我运行迁移时,它会抱怨:

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

3 个答案:

答案 0 :(得分:63)

这是因为您的现有数据对该新列没有任何价值,即null。从而导致所述错误。添加不可为空的列时,必须确定为现有数据提供的值

好吧,现在的数据应该只有这个新列的“lorem ipsum”。但是我该怎么办呢?我无法更新,因为该列还没有。

使用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)

删除它

E.g。您的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)

答案 1 :(得分:25)

@ Ron的答案的替代方法是反过来,并在添加约束之前修改数据

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: - )。

答案 2 :(得分:3)

它正确地告诉您,数据库中该列存在(或将存在)空值。答案是在更改列定义之前编辑迁移文件以更新列:

from sqlalchemy.sql import table, column

def upgrade():
    op.add_column('role', sa.Column('role_name', sa.String(length=30), nullable=True))
    role = table('role', column('role_name'))       
    op.execute(role.update().values(role_name=''))       
    op.alter_column('role', 'role_name', nullable=False)