Flask-Migrate会生成一个migrations文件夹和在数据库中生成一个alembic_version表
migrations
每次升级数据库,当执行
python manage.py db migrate -m "commit"
会在migrations\versions下新建一个脚本.py,记录了升级前后差异信息,以便告知Flask-Migrate升级要做哪些动作
03771CD3-4FF5-4A6E-89C2-A8753B77F242.png如图
-
脚本版本为:96d38f93d44f
降级版本为:3c487a0fc4a8 -
数据库升级到当前版本需要做的动作是(upgrade方法):在roles表中,添加column字段'typefour',类型为Integer,可为空
-
数据库从当前版本降级需要做的动作是(downgrade方法):从roles表中删除名为'typefour' 的column
alembic_version表
此时数据库中会自动创建一个alembic_version表格,只有一个字段和一个值version_num,记录当前的数据库版本。
执行
python manage.py db upgrade
数据库会更新,同时更新alembic_version表,记录最新的版本id
问题一
报错如下:
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "DROP": syntax error [SQL: u'ALTER TABLE roles DROP COLUMN typefive']
为了做实验我在Role里添加了好多字段:
model.png table-roles.png
我想删除typefive,先从model删除typefive:
model.png然后执行到upgrade的时候,报错
google发现是因为:SQLite不支持删除或更改列
那好吧,我不改了。但是这个时候已经是不正常的了。再执行别的命令会报错如下:
alembic.util.exc.CommandError: Target database is not up to date.
因为有最新的更新脚本没有被更新到数据库里,如下:
9084A84F-5D3E-4C32-B088-1094604D281F.png最简单的办法是删除a1f06e80ab57_delete_five.py,反正SQLite不支持删除或更改列,这个脚本也没用。然后另想办法删除想要删除的列
参考:https://stackoverflow.com/questions/30394222/why-flask-migrate-cannot-upgrade-when-drop-column
这个链接里给出了SQLite删除列的相关解决方案的链接,还没来得及细看
网友评论