Python 如何为Alembic编写可移植的布尔列

Python 如何为Alembic编写可移植的布尔列,python,sqlalchemy,alembic,flask-migrate,Python,Sqlalchemy,Alembic,Flask Migrate,我正在开发一个Flask应用程序,使用Flask Migrate(以及Alembic)来管理对DB的更改。我在前面遇到了一个问题,更改一些不可为null的布尔列在底层数据库中触发了一个错误 我删除一个布尔列,并重命名另一个(相当于两次删除和一次添加) def升级(): #####由Alembic自动生成的命令-请调整### op.add_列('user',sa.column('is_enabled',sa.Boolean(),nullable=False)) op.drop_列('user','

我正在开发一个Flask应用程序,使用Flask Migrate(以及Alembic)来管理对DB的更改。我在前面遇到了一个问题,更改一些不可为null的布尔列在底层数据库中触发了一个错误

我删除一个布尔列,并重命名另一个(相当于两次删除和一次添加)

def升级():
#####由Alembic自动生成的命令-请调整###
op.add_列('user',sa.column('is_enabled',sa.Boolean(),nullable=False))
op.drop_列('user','is_disabled')
op.drop_列('user','is_deleted')
#####结束Alembic命令###
由于数据库中已有数据,因此add需要一个默认值来用于现有行。但是,SQLAlchemy的人在布尔列中添加了对
server\u default
的(可移植)支持


在这些条件下,是否有任何方法可以进行迁移并保持数据库的可移植性,或者我是否需要将代码限制为一个数据库,并根据布尔列的底层DB驱动程序开始编写
server\u默认值
是的,您可以更改升级(可能还包括降级)实现你想要的功能。另外,请注意,当前升级不会维护现有数据,因为您正在添加新列并删除旧列。由于alembic无法检测到重命名,您需要更改自动生成的升级(和降级)函数

要实现回填数据库所需的功能,请执行以下操作:

  • 添加/重命名不带
    nullable
    约束的列
  • 当当前值为
    Null
    时,使用默认值回填现有行
  • 更改列以包括
    可为空的
    约束:
要解决重命名问题,您需要将添加和删除行更改为1 alter row:

def升级():
#####由Alembic自动生成的命令-请调整###
op.alter_column('user','is_disabled',new_column_name='is_enabled')
op.execute('更新用户集已禁用=false,其中已禁用为null')
op.alter_列('user','is_enabled',nullable=False)
op.drop_列('user','is_deleted')
#####结束Alembic命令###
另外,当您将
禁用
更改为
启用
时,如果需要,您可以使用
op.execute
切换布尔值