当我们对一个已存在数据的Table中添加一个nullable=False的列时,通常alembic会直接报错,因为它不知道要给这个列赋予什么值,所以会默认给个NULL的值,但是这个值与nullable=False的规则冲突了。

通常这种不能为空的列都是应该有一个默认值的,所以可以直接在alembic中指定这个列的默认值:

:::python
op.add_column('callroom', sa.Column('consulvalid', sa.Integer(), nullable=True, server_default=text("0")))

但也有可能这个默认值只想在Python的orm环境中定义,不想定义到数据库中,比如

:::python
class MyClass(Base):
    name = Column(Unicode(40), default=u'hello')

这种情况下,可以这么修改alembic迁移脚本:

:::python
from sqlalchemy.sql import table, column
op.add_column('callroom', sa.Column('consulvalid', sa.Boolean(), nullable=True))
callroom = table("callroom", column("consulvalid", sa.Boolean()))
op.execute(callroom.update().values(consulvalid=False))
op.alter_column("callroom", "consulvalid", nullable=False)

即先增加了一个nullable=True的列,然后将这个列设置默认值后,再改成nullable=False