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");

反正感觉这玩意很玄乎。

posted @ 2020-04-27 22:18  天青色wy  阅读(351)  评论(0编辑  收藏  举报