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
相关推荐
smileNicky9 小时前
SpringBoot系列之从繁琐配置到一键启动之旅
java·spring boot·后端
David爱编程10 小时前
为什么必须学并发编程?一文带你看懂从单线程到多线程的演进史
java·后端
long31610 小时前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
rannn_11111 小时前
【Javaweb学习|黑马笔记|Day1】初识,入门网页,HTML-CSS|常见的标签和样式|标题排版和样式、正文排版和样式
css·后端·学习·html·javaweb
柏油11 小时前
Spring @Cacheable 解读
redis·后端·spring
柏油12 小时前
Spring @TransactionalEventListener 解读
spring boot·后端·spring
两码事14 小时前
告别繁琐的飞书表格API调用,让飞书表格操作像操作Java对象一样简单!
java·后端
shark_chili14 小时前
面试官再问synchronized底层原理,这样回答让他眼前一亮!
后端
灵魂猎手15 小时前
2. MyBatis 参数处理机制:从 execute 方法到参数流转全解析
java·后端·源码
易元15 小时前
模式组合应用-桥接模式(一)
后端·设计模式