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
相关推荐
丘山子15 分钟前
一些鲜为人知的 IP 地址怪异写法
前端·后端·tcp/ip
CopyLower39 分钟前
在 Spring Boot 中实现 WebSockets
spring boot·后端·iphone
.生产的驴2 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
景天科技苑2 小时前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配
追逐时光者2 小时前
MongoDB从入门到实战之Docker快速安装MongoDB
后端·mongodb
方圆想当图灵3 小时前
深入理解 AOP:使用 AspectJ 实现对 Maven 依赖中 Jar 包类的织入
后端·maven
豌豆花下猫3 小时前
Python 潮流周刊#99:如何在生产环境中运行 Python?(摘要)
后端·python·ai
嘻嘻嘻嘻嘻嘻ys3 小时前
《Spring Boot 3 + Java 17:响应式云原生架构深度实践与范式革新》
前端·后端
异常君3 小时前
线程池隐患解析:为何阿里巴巴拒绝 Executors
java·后端·代码规范
mazhimazhi3 小时前
GC垃圾收集时,居然还有用户线程在奔跑
后端·面试