Alembic: IntegrityError: 当添加非空列时,“ column  包含 null value”

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

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

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

sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
27967 次浏览

这是因为您现有的数据在新列上没有值,即 null。因此造成了上述错误。在添加不可为空的列时,必须决定为已存在的数据赋什么值


好吧,现有的数据应该只有这个新列的“ lorem ipsum”。但我该怎么做呢?我不能更新,因为这个列还没有出现。

使用 server_default参数:

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)

与@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: ——)。

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

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)