Tortoise_orm与Aerich 迁移

1. 安装 aiomysqltortoise-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
相关推荐
wuk99821 分钟前
互联网应用主流框架整合 Spring Boot开发
java·spring boot·后端
程序员NEO1 小时前
10分钟上线一个Web应用?我没开玩笑,用这个AI智能体就行
人工智能·后端
倔强青铜三2 小时前
Python的Lambda,是神来之笔?还是语法毒瘤?
人工智能·后端·python
a cool fish(无名)2 小时前
rust-方法语法
开发语言·后端·rust
随意石光2 小时前
秒杀功能、高并发系统关注的问题、秒杀系统设计
后端
随意石光2 小时前
Spring Cloud Alibaba Seata、本地事务、分布式事务、CAP 定理与 BASE 理论、Linux 安装 Seata、Seata的使用
后端
程序员清风2 小时前
程序员入职公司实习后应该学什么?
java·后端·面试
智慧源点2 小时前
基于DataX的数据同步实战
后端
随意石光2 小时前
Java操作Excel报表,EasyExcel用法大全
后端
大葱白菜3 小时前
Java 反射的作用详解:为什么说它是 Java 中最强大的特性之一?
java·后端·程序员