我正在向现有表中添加一列。这个新列是 nullable=False。
nullable=False
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
当我运行迁移时,它会抱怨:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
这是因为您现有的数据在新列上没有值,即 null。因此造成了上述错误。在添加不可为空的列时,必须决定为已存在的数据赋什么值
null
好吧,现有的数据应该只有这个新列的“ lorem ipsum”。但我该怎么做呢?我不能更新,因为这个列还没有出现。
使用 server_default参数:
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)后丢弃它
op.alter_column('mytable', 'mycolumn', server_default=None)
例如,你的 upgrade()函数是:
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)