美文网首页
Flask-Migrate碰到的问题

Flask-Migrate碰到的问题

作者: thinkq | 来源:发表于2017-10-20 21:24 被阅读598次

    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删除列的相关解决方案的链接,还没来得及细看

    相关文章

      网友评论

          本文标题:Flask-Migrate碰到的问题

          本文链接:https://www.haomeiwen.com/subject/fthvuxtx.html