Flask学习笔记(7):flask-migrate
flask-migrate相当于是给alembic进行了flask式的封装一样,以前用alembic做数据库版本迁移时,要初始化:alembic init alembic,然后就是修改配置文件,然后生成版本:alembic revision --autogenerate -m "xxx",更新到最新版本:alembic upgrade head,这一套流程走下来很麻烦,现在将这些命令跟manage绑定到一起,直接用python manage.py db init/migrate/upgrade就能实现数据库的版本迁移了,很方便。
安装:pip install flask-migrate
小项目的基本结构:
正常情况下将数据库表对应的所有模型放在models.py里面,要用到db,得从app.py 导入,但是app.py也要导入models.py里面的模型,这样就形成了循环引用。现在将db放在第三方模块exts.py中,这样,models和app就都能够从exts中去导入db。
app.py:
manage.py:
modles.py:
上面这五个模块之间的关系一定要理清楚!
cmd命令:
==================================== 华丽的分割线 ============================================
使用了一段时间后发现,在数据库迁移时有很多坑:
1、有时migrate时:
等你去upgrade时又是报错,这时不要慌,查看mysql里的当前版本号:
再去版本库里面根据时间轴删除比当前版本号新的版本,或者downgrade + 版本号回退到以前的版本。
2、更改表的字段内的属性值而不改字段名是不会生成迁移脚本的,如
将默认值从100改为0,再去migrate:
显示未检测到改变。
3、有时设置default默认值无效,如default="0",或者把双引号变为单引号也无效,用server_default="100"就行了。
有时用server_default也会报错,说只支持字符串和其他两种类型的数据:
sqlalchemy.exc.ArgumentError: Argument 'arg' is expected to be one of type '<class 'str'>' or '<class 'sqlalchemy.sql.elements.ClauseElement'>' or '<class 'sqlalchemy.sql.elements.TextClause'>', got '<class 'int'>'
解决:
form sqlalchemy import text
server_default = text("100");
反正感觉这玩意很玄乎。