Tortoise_orm与Aerich 迁移

1. 安装 aiomysql 和 tortoise-orm

在终端中运行以下命令以安装所需的依赖项:

复制代码
pip install aiomysql tortoise-orm

2. 配置 Tortoise-ORM

在您的项目中,您需要配置 Tortoise-ORM 的初始化。以下是集成步骤:

创建 config/tortoise.py 文件

新建一个文件来存放 Tortoise-ORM 的配置,例如:

csharp 复制代码
    
from tortoise import Tortoise


TORTOISE_ORM = {
    "connections": {
        "default": "mysql://username:password@localhost:3306/your_database"
    },
    "apps": {
        "models": {
            "models": ["model.model", "aerich.models"],  # 添加 aerich 的模型
            "default_connection": "default",
        },
    },
}

async def init_tortoise():
    await Tortoise.init(
        config=TORTOISE_ORM
    )
    # 如果需要自动生成表结构,可以调用 generate_schemas
    await Tortoise.generate_schemas()

async def close_db():
    await Tortoise.close_connections()

创建 models 文件夹和模型文件

在项目根目录下创建 models 文件夹,并在其中定义您的数据库模型。例如:

ini 复制代码
from tortoise.models import Model
from tortoise import fields


class Admin(Model):
    id = fields.IntField(pk=True,generated=True,auto_increment=True)
    username = fields.IntField(max_length=25,description="用户名")
    password = fields.CharField(max_length=32, description="密码")
    mobile = fields.CharField(max_length=11, description="手机号")
    avatar = fields.CharField(max_length=150, description="头像",null=True)
    nickname = fields.CharField(max_length=25, description="昵称",null=True)
    ctime = fields.DatetimeField(auto_now_add=True, description="创建时间",null=True)
    utime = fields.DatetimeField(auto_now_add=True, description="更新时间",null=True)

    class Meta:
        table = "jm_admin"
        indexes = ["username","mobile"]
        unique_together = (("username", "mobile"),)
        ordering = ["-id"]

在 main.py 中集成 Tortoise-ORM

python 复制代码
from fastapi import FastAPI
from router.api import api
from config.mysql import init_tortoise,close_db
from contextlib import asynccontextmanager

# 定义 lifespan 上下文管理器
@asynccontextmanager
async def lifespan(app: FastAPI):
    # 启动时执行的逻辑
    await init_tortoise()
    print("MySQL database registered.")
    yield  # 应用运行中
    # 关闭时执行的逻辑
    await close_db()
    print("MySQL connection closed.")

app = FastAPI(
    debug=True,
    title="九猫科技",
    version="0.0.1",
    description="九猫科技后台管理系统",
    lifespan=lifespan
)

app.include_router(api)


if __name__ == "__main__":
     import uvicorn
     uvicorn.run(app="main:app", host="127.0.0.1", port=8000,reload=True)

3. 安装Aerich迁移工具

Aerich是用于TortoiseORM的数据库迁移工具,通过这个工具可以根据模型类来对数据库做出改变

复制代码
pip install aerich tomlkit

运行 Aerich 初始化命令

arduino 复制代码
aerich init -t config.mysql.TORTOISE_ORM

运行以下命令以初始化迁移目录:

csharp 复制代码
aerich init-db

验证 Aerich 是否正常工作

如果上述步骤成功,您可以使用以下命令创建迁移文件并应用迁移:

  • 创建迁移文件:

    aerich migrate

  • 应用迁移:

    aerich upgrade

  • 执行回退 如果想回退到执行之前可以执行回退操作

    aerich downgrade

更新模型

  • 进行追踪并生产迁移文件
bash 复制代码
# 直接进行追踪 
aerich migrate 
# 进行追踪并指定生成的迁移文件的部分命名
aerich migrate --name drop_column
  • 执行改变

上面的migrate只是追踪模型类有什么变化,然后生成一个迁移文件,但这时候具体的改变还没有应用到数据库

注意: 执行下面的命令必须已经完成初始化配置信息和初始化数据库 。

执行命令来将变化应用到数据库当中:

复制代码
aerich upgrade

数据库表映射成模型类

有时数据库表是已经创建好了的,需要将其转为模型类,再通过ORM去操作数据库。aerich也有相对应的命令来帮助我们将数据库表映射成模型类

注意: 执行下面的命令必须已经完成初始化配置信息和初始化数据库。

执行命令以映射:

bash 复制代码
# 映射所有的表并输出到控制台
aerich --app models inspectdb
# 指定一个表进行映射
aerich inspectdb -t user
# 映射所有表并将内容输出到文件当中(通常不会将映射内容直接输出到控制台)
aerich --app models inspectdb > models.py
相关推荐
三小河几秒前
从 Markdown 到 Generative UI:AI 如何从“生成答案”进化到“生成界面”?
前端·人工智能·后端
韩振方9 分钟前
为什么加了 sudo,写配置文件还是 Permission denied?
后端
牛奔43 分钟前
mise 管理多版本 Go 项目
开发语言·前端·chrome·后端·golang
打工仔折腾 AI2 小时前
FaceFusion本地换脸实战:Windows整合包、模型选择与遮罩调参记录
人工智能·windows·后端·python·深度学习·性能优化·ai agent 实战
Nebula_g2 小时前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase
弈栈录2 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
后端·架构
邱杰4702 小时前
从零手写数智人事系统(十二):部门树、角色授权与菜单维护
后端
PC2005_cloud2 小时前
AI 汉字漂移实录:它为什么总把「学习」写成日语「学習」
前端·后端
码剑客2 小时前
告别逐张排查DICOM:6维度本地批量校验方案,数据零上传更合规
后端
RaaS1002 小时前
AI网关能做Prompt注入防护吗?AI网关核心功能详解
前端·后端