正在进入ing...

Fastapi + Trotoise ORM 数据库迁移备忘

发布时间:2024-08-06 浏览量: 2042 文章分类: python

Fastapi + Trotoise ORM 数据库迁移备忘

实际这个事情在使用框架选型前,我没有过多考虑,因为都是跑一些小项目,大不了表删除了 重新在创建就完美解决了。但今天遇到了一个不好搞的问题。 我们的一个历史线上对外的项目 因为功能升级,需要在一张表增加几个字段,但是表里有几百万的数据,我也懒得导出在导入。本身web服务都在容器中,这样操作也很麻烦。

所以就想起来了Djangomigationmakemigrations 这种方法了。别说,还真的找到了。

首先,我们需要安装 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",

}