SQLalchemy 版本迁移工具 alembic 使用

SQLAlchemy是python里的处理模ORM(模型关系映射)一套工具,可以通过直观地通过定义python中的class来定义数据表结构,通过操作class的具体object来操作数据记录。 Alembic是一套管理数据库升降级的迁移工具,比如在实际业务场景中需要对已经定义好的模型进行增删字段操作,可以通过alembic来对升降级进行方便地可控地操作。

安装用到的包

pip install pymysql
pip install sqlalchemy
pip install alembic

alembic 初始化和配置

完成 pip 安装之后

  • 在 shell 里面 cd 到项目的根目录执行
    alembic init alembic (初始化完成后,会生成一个alembic.ini配置文件及一个alembic目录)
  • 用 pycharm 新建一个文件夹alembic,把生成的文件 download 回来(包括 alembic 目录和 alembic.ini)


    image.png
  • 修改 alembic.ini 设置数据库连接。
    sqlalchemy.url = driver://user:pass@localhost/dbname
    image.png
  • 在 env.py 中设置,将target_metadata赋值成数据库的元数据(metadata)
    如果执行 revision 有 import 报错,注意是否正确将当前项目目录添加到 sys.path 路径


    image.png

基于数据库 model 定义进行更新

将 model 定义好,并确认在 env.py 里导入的 Base 类是在 model 定义的地方的

  • 配置完成执行( -m "注释信息",根据情况更改,会用到生成的py文件名字里)
    alembic revision --autogenerate -m "create_user_table"
    这里可以看到虚拟机目录在 alembic/versions 里生成了 py 文件,


    image.png

    检查确认更新的内容,然后执行
    alembic upgrade head
    这样就会更新 mysql 数据库了

命令参考

查看记录和历史
  • alembic history
查看生成的 py 文件
  • ls -l alembic/versions
其他操作
  • 删除 alembic/versions/xxx.py

常见问题

  • 执行 alembic 报错,KeyError:'5b29018b55ba'
    原因:该版本曾经upgrade执行过了,但是文件被删除,
    解决办法:更新是数据库 alembic_version 表记录
    ERROR [alembic.util.messaging] Can't locate revision identified by 'a2de455a4f51' FAILED: Can't locate revision identified by 'a2de455a4f51'
  • 执行 alembic autogenerate 没有看到数据库更新
    原因:Base import 不正确,或者 model 定义不正确
    解决办法:检查 model 代码
    数据库还没有执行 upgrade head 更新,不能执行 autog
    ERROR [alembic.util.messaging] Target database is not up to date. FAILED: Target database is not up to date.
    删除所有 py 文件之后的重新开始,最好把数据库的表也删除完
    这样才能确保生成的py文件反应所有数据库变更
    单独更改列名或一些列属性和表名等不能自动识别
    需要注意
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,018评论 3 119
  • SQLAlchemy是python的一个数据库ORM工具,提供了强大的对象模型间的转换,可以满足绝大多数数据库操作...
    bomo阅读 2,934评论 2 5
  • 3月22日15:16 刚刚跟朋友说完一些不开心的事,突然觉得我们就像两只困兽,挣脱不开囚牢,身心疲惫,只等着外面众...
    亦容阅读 117评论 0 0
  • 自被追杀起,到今天已经3天了,摆脱追杀者有2日了。 已经精疲力竭的萧若兰,依旧倔强的一瘸一拐的咬着牙,蹒跚的在乡野...
    萧萧秋雨阅读 1,104评论 34 29