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

    反正感觉这玩意很玄乎。

  • 相关阅读:
    其他
    聚类算法:ISODATA算法
    大神博客
    Fiddldr 教程之:HTTP协议详解(转)
    设计模式之装饰模式的复习
    NOIP 2011 聪明的质监员
    CSP-S2020/NOIP2020模板总结(Updating)
    CSP-S2020/NOIP2020复习指南
    洛谷 U137412 高斯的小宇宙
    NOIP2020模板测试题大全
  • 原文地址:https://www.cnblogs.com/wangyi0419/p/12784196.html
Copyright © 2020-2023  润新知