使用Flask-Migrate(alembic)实现MySQL表名修改、字段名修改和枚举类型修改

  • 表名修改
  • 字段名修改
  • 枚举类型增加枚举可选值

表名修改

由于之前创建的MySQL数据表名跟实际用处不符,所以需要修改表名,并保证数据不丢失。
若直接修改表名,然后使用命令python manage.py db migrate会删除后新建,导致数据丢失。为了保证数据不丢失,可以自己使用alembic语法编写升级脚本。语法如下:

1
op.rename_table('shop_print_rules', 'label_print_rules')

字段名修改

由于字段名名不副实,所以要对字段名进修改,并保证数据不丢失。
若字节修改字段名,然后使用命令python manage.py db migrate会删除后新建,导致数据丢失。使用下列语法可以保证数据不丢失,但需要自己编写升级脚本。语法如下:

1
2
3
4
op.alter_column('label_print_rules', 'box_template_type', new_column_name='template_type',
existing_type=sa.Enum('single_box', 'all_box', 'pick', 'putaway',
'stockin', 'stockout', 'delivery')
server_default='single_box')

枚举类型字段增加枚举可选值

当对枚举类型字段增加枚举可选值时,使用Flask-Migrate进行migrate不会检测到改动,所以需要手动写脚本。语法如下:

1
2
3
4
5
6
7
op.alter_column('label_print_rules', 'template_type',
existing_type=sa.Enum('single_box', 'all_box', 'pick', 'putaway',
'stockin', 'stockout', 'delivery'),
type_=sa.Enum('single_box', 'all_box', 'pick', 'putaway',
'stockin', 'stockout', 'delivery', 'single_picking_label',
'multi_picking_label', 'order_picking_label'),
server_default='single_box')

作者 @yaoel
2017 年 05月 09日

参考:
1.alembic.op.rename_table
2.Flask-Migrate升级MySQL字段时能否重命名而非删除后新建