0%

Flask-Migrate检测字段类型变化

Flask-Migrate

Flask-Migrate是依赖于Alembic的,Alembic默认不检测字段类型变化,可以通过修改代码来开启。

开启字段类型检测

找到 mi­gra­tions/env.py 文件,在 run_mi­gra­tions_on­line 函数中增加调用 context.configure 函数时的参数:

1
2
3
4
5
context.configure(
......
compare_type=True, # 比较字段类型
compare_server_default=True # 比较默认值
)

开启后可能会出现的问题

每次都会检测到相同的字段类型变化

开启字段类型检测之后,可能会出现一个问题——每次都会检测到相同的字段类型变化,如下:

1
2
3
4
5
6
7
$ flask db migrate
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected type change from TINYINT(display_width=1) to Boolean() on 'orders.complete'
INFO [alembic.autogenerate.compare] Detected type change from TINYINT(display_width=1) to Boolean() on 'tranactions.type'
INFO [alembic.autogenerate.compare] Detected type change from TINYINT(display_width=1) to Boolean() on 'users.confirmed'
Generating /srv/www/waasle/migrations/versions/4da4194e339d_.py ... done

解决方法

在 mi­gra­tions/env.py 文件中增加以下函数:

1
2
3
4
5
6
7
8
9
10
11
12
def my_compare_type(
context, inspected_column, metadata_column, inspected_type,
metadata_type
):
from sqlalchemy.dialects import mysql
from sqlalchemy.sql import sqltypes
if (
isinstance(inspected_type, mysql.types.TINYINT)
and isinstance(metadata_type, sqltypes.Boolean)
):
return False
return None

在 run_mi­gra­tions_on­line 函数中修改调用 context.configure 函数时的参数:

1
2
3
4
context.configure(
......
compare_type=my_compare_type
)

参考文档

https://github.com/miguelgrinberg/Flask-Migrate/issues/143