Fastapi + Trotoise ORM 数据库迁移备忘
Fastapi + Trotoise ORM 数据库迁移备忘
实际这个事情在使用框架选型前,我没有过多考虑,因为都是跑一些小项目,大不了表删除了 重新在创建就完美解决了。但今天遇到了一个不好搞的问题。 我们的一个历史线上对外的项目 因为功能升级,需要在一张表增加几个字段,但是表里有几百万的数据,我也懒得导出在导入。本身web服务都在容器中,这样操作也很麻烦。
所以就想起来了Django的 migation 、 makemigrations 这种方法了。别说,还真的找到了。
首先,我们需要安装 pip install aerich 这个库,貌似就是专门用作于迁移来使用的库。
配置连接数据库
命令如下: aerich init -t database.mysql.DB_ORM_CONFIG (我的 DB_ORM_CONFIG 样例在最下面)
这个 database.mysql.DB_ORM_CONFIG 就是 FastAPI的 数据库配置字典。
成功执行以后会有如下提示,同时在web的同级目录下创建migrations文件夹
简单点理解就是他确认了数据库连接,会在根目录下面也生成一个 pyproject.toml文件。
# pyproject.toml
[tool.aerich]
tortoise_orm = "database.mysql.DB_ORM_CONFIG"
location = "./migrations"
src_folder = "./."
执行的结果如下就说明没问题。
(mypy) D:\web>aerich init -t database.mysql.DB_ORM_CONFIG
Success create migrate location ./migrations
Success write config to pyproject.toml
注册Aerich模型
重点! 重点!! 重点!!!
这里耽误我很久的时间,查了办法资料,发现需要注册aerich.models,可以参考我下面 DB_ORM_CONFIG 的样例。
执行初始化数据库 - 类似django makemigrations
aerich init-db,这一步就是初始化数据库,
执行后也是下面的提示, 就是生成好了迁移文件了
Success create app migrate location migrations\base
Success generate schema for app "base"
生成合并文件 - 类似django migrate
aerich migrate 或者 aerich migrate --name 指定的名称,这样在 migrations\base下面就会生成迁移文件了。
开始执行
aerich upgrade 执行后会有明确提示 Success upgrade 5_20240806143948_xxxx.py ,这个时候在去数据库查看变更状态应该就生效了。
总结
这玩意整体的逻辑和django一致。但实际使用下来 感觉没用django-orm那么丝滑,但也能用。
DB_ORM_CONFIG = {
"connections": {
"default": {
"engine": "tortoise.backends.mysql",
"credentials": {
"host": host,
"user": user,
"password": password,
"port": port,
"database": database,
},
}
},
"apps": {
"base": {
"models": [
# 重点,一定要加这个
"aerich.models",
# ...这里就是自己的数据库文件
],
"default_connection": "default",
},
"citymap":{
"models":[
'models.citymap_models',
],
"default_connection": "default",
},
# 有多少就写多少
},
"use_tz": False,
"timezone": "Asia/Shanghai",
}