Python 如何为Alembic编写可移植的布尔列
我正在开发一个Flask应用程序,使用Flask Migrate(以及Alembic)来管理对DB的更改。我在前面遇到了一个问题,更改一些不可为null的布尔列在底层数据库中触发了一个错误 我删除一个布尔列,并重命名另一个(相当于两次删除和一次添加)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','
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
切换布尔值