我正在向现有表添加列。这个新列是nullable=False
。
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
当我运行迁移时,它会抱怨:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
答案 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)