Flask-Migrate碰到的问题

Flask-Migrate会生成一个migrations文件夹和在数据库中生成一个alembic_version表

migrations

每次升级数据库,当执行

python manage.py db migrate -m "commit" 

会在migrations\versions下新建一个脚本.py,记录了升级前后差异信息,以便告知Flask-Migrate升级要做哪些动作

Flask-Migrate碰到的问题_第1张图片
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里添加了好多字段:


Flask-Migrate碰到的问题_第2张图片
model.png
Flask-Migrate碰到的问题_第3张图片
table-roles.png

我想删除typefive,先从model删除typefive:

Flask-Migrate碰到的问题_第4张图片
model.png

然后执行到upgrade的时候,报错

google发现是因为:SQLite不支持删除或更改列
那好吧,我不改了。但是这个时候已经是不正常的了。再执行别的命令会报错如下:

alembic.util.exc.CommandError: Target database is not up to date.

因为有最新的更新脚本没有被更新到数据库里,如下:

Flask-Migrate碰到的问题_第5张图片
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删除列的相关解决方案的链接,还没来得及细看

你可能感兴趣的:(Flask-Migrate碰到的问题)