一、tortoise在fastapi中关于数据库的操作需要集成本身没有相关方法。tortoise和django中orm十分相似二、环境准备与数据库配置1. 安装依赖# 安装 Tortoise-ORM 核心库 pip install tortoise-orm #MySQL 异步驱动推荐 asyncmy pip install asyncmy 或者 pip install aiomysql # 安装 Aerich 迁移工具 pip install aerich2. Tortoise-ORM 配置文件在app/config.py中定义数据库连接配置后续会被register_tortoise或Aerich引用python运行# app/config.py TORTOISE_ORM { # 1. 连接配置 —— 定义数据库连接信息 connections: { # default 是默认连接的名字必须有一个 default default: { # engine: 指定数据库后端引擎, MySQL 使用 tortoise.backends.mysql engine: tortoise.backends.mysql, # credentials: 数据库连接凭证包含主机、端口、用户名、密码等 credentials: { host: 127.0.0.1, # MySQL 服务器地址 port: 3306, # MySQL 端口默认 3306 user: root, # 数据库用户名 password: 123456, # 数据库密码请根据实际情况修改 database: firstfast, # 数据库名称 minsize: 1, # 连接池最小连接数 maxsize: 5, # 连接池最大连接数 charset: utf8mb4, # 字符集支持 emoji echo: True # 是否打印 SQL 语句开发环境建议开启 } } }, # 2. 应用配置 —— 指定模型所在的模块 apps: { # models 是应用的名字可以自定义但 Aerich 需要使用这个名字 models: { # models 列表: 指定包含 Tortoise 模型类的 Python 模块路径 # aerich.models 是 Aerich 的内置模型用于记录迁移历史必须包含 models: [app.models, aerich.models], # default_connection: 指定这个应用使用哪个数据库连接 default_connection: default, } } }三、模型定义Tortoise-ORM在app/models.py中定义用户模型继承自tortoise.models.Model模型属性对应数据库表字段。python运行# app/models.py from tortoise.models import Model from tortoise import fields class User(Model): 用户模型 id fields.IntField(pkTrue, description自增主键) username fields.CharField(max_length20, uniqueTrue, description用户名) password fields.CharField(max_length100, description密码) email fields.CharField(max_length20, nullTrue, description邮箱) age fields.IntField(default16, description年龄) isdel fields.BooleanField(defaultFalse, description是否删除) created_at fields.DatetimeField(auto_now_addTrue, description创建时间) updated_at fields.DatetimeField(auto_nowTrue, description更新时间) class Meta: table user # 指定数据库表名常用字段类型速查表表格字段类型Python 类型数据库类型说明fields.IntField(pkTrue)intINT AUTO_INCREMENT自增主键fields.CharField(max_lengthN)strVARCHAR(N)可变长字符串fields.TextField()strTEXT长文本fields.BooleanField(defaultTrue)boolBOOL/TINYINT布尔值fields.DatetimeField(auto_now_addTrue)datetimeDATETIME创建时间自动赋值fields.DatetimeField(auto_nowTrue)datetimeDATETIME更新时间自动更新四、数据库迁移AerichAerich 是 Tortoise-ORM 的官方迁移工具用于管理数据库表结构变更。1. 初始化 Aerich在项目根目录执行bash运行aerich init -t app.config.TORTOISE_ORM执行后会生成pyproject.tomlAerich 配置文件migrations/目录存放迁移文件2. 生成迁移文件bash运行aerich migrate --name init_user_model3. 执行迁移bash运行aerich upgrade五、Pydantic 请求体定义在app/schemas/user.py中定义请求体模型用于接收和校验前端数据。python运行# app/schemas/user.py from pydantic import BaseModel, Field class UserCreate(BaseModel): 创建用户请求体 username: str Field(..., max_length20, description用户名) password: str Field(..., max_length10, description密码) email: str Field(None, max_length20, description邮箱) age: int Field(16, description年龄) class UserUpdate(BaseModel): 更新用户请求体所有字段可选 username: str Field(None, max_length20, description用户名) password: str Field(None, max_length10, description密码) email: str Field(None, max_length20, description邮箱) age: int Field(None, description年龄) isdel: bool Field(None, description是否删除)六、用户模块 CRUD 接口实现使用APIRouter模块化管理用户接口在app/api/user.py中编写增删改查逻辑。python运行# app/api/user.py from fastapi import APIRouter from app.models import User from app.schemas.user import UserCreate, UserUpdate # 创建一个APIRouter实例 user_router APIRouter( prefix/user, # 路由前缀 tags[用户模块], # 接口文档路由标签 ) # ------------------- 查询所有用户 ------------------- user_router.get(path/fetchall, summary查询所有用户) async def get_all_user(): # 所有orm方法都要加上await关键字 users await User.all() # 不需要序列化就可以返回 return {msg: 查询成功, code: 200, data: users} # ------------------- 查询单个用户 ------------------- user_router.get(path/fetchone/{id}, summary查询某个用户) async def get_one_user(id: int): # get_or_none()方法可以查询某个对象若对象不存在则返回None # get()方法会抛异常 userobj await User.get_or_none(idid) # 等同于上面的 # userobj1 await User.filter(idid).first() return {msg: 查询成功, code: 200, data: userobj} # ------------------- 添加用户 ------------------- user_router.post(path/adduser, summary添加用户) async def add_user(user: UserCreate): # 接收请求体数据 # 方法一create创建简单高效 可以返回创建的对象 userobj await User.create(**user.dict()) print(userobj) # 方法二save保存 可以在保存之前进行其他操作 不会返回创建的对象 # userobj User(**user.dict()) # 首先创建一个User对象 # await userobj.save() return {msg: 添加成功, code: 200} # ------------------- 删除用户 ------------------- user_router.delete(path/userdel/{id}, summary删除用户) async def delete_user(id: int): # 方法一该方法常用于返回删除的对象 # userobj await User.get_or_none(idid) # if not userobj: # return {msg: 用户不存在, code: 400} # await userobj.delete() # 方法二delete() 可以批量删除 返回删除的行数 count await User.filter(idid).delete() # print(count) return {msg: 删除成功, code: 200} # ------------------- 修改用户 ------------------- user_router.put(path/updateuser/{id}, summary修改用户) async def update_user(id: int, user: UserUpdate): # 将前端传过来的值转换成字典并剔除掉值为None的值 userdata user.dict(exclude_unsetTrue) # 方法一save()保存 可以返回修改后的对象 # userobj await User.get_or_none(idid) # if not userobj: # return {msg: 用户不存在, code: 400} # for i,j in userdata.items(): # # setattr方法用于动态设置对象的属性 # # setattr(x, y, v) is equivalent to x.y v # setattr(userobj, i, j) # await userobj.save() # return {msg: 修改成功, code: 200, data: userobj} # 方法二update()更新 批量修改 可以返回修改的行数 result await User.filter(idid).update(**userdata) return {msg: 修改成功, code: 200, data: result}Tortoise-ORM 常用查询方法表格方法类型功能描述代码示例.all()QuerySet获取表中的所有记录all_users await User.all().get()QuerySet根据条件获取单个对象未找到或找到多个会引发异常user await User.get(id1).get_or_none()QuerySet根据条件获取单个对象未找到则返回 Noneuser await User.get_or_none(id1).filter()QuerySet根据指定条件筛选一组记录users await User.filter(age__gt18).exclude()QuerySet排除满足指定条件的记录users await User.exclude(isdelTrue).first()QuerySet返回查询集的第一个对象如果没有则返回 Noneuser await User.filter(age16).first().last()QuerySet返回查询集的最后一个对象如果没有则返回 Noneuser await User.filter().last().latest()QuerySet根据指定字段排序获取最新的记录user await User.latest(created_at).earliest()QuerySet根据指定字段排序获取最早的记录user await User.earliest(created_at)七、注册路由到主应用在main.py中注册 Tortoise-ORM 和用户路由python运行# main.py from fastapi import FastAPI from tortoise.contrib.fastapi import register_tortoise from app.config import TORTOISE_ORM from app.api.user import user_router app FastAPI(titleFastAPI Tortoise-ORM 示例) # 注册用户路由 app.include_router(user_router) # 注册 Tortoise-ORM register_tortoise( app, configTORTOISE_ORM, generate_schemasTrue, # 自动生成表结构开发环境用 add_exception_handlersTrue, )八、启动服务与测试bash运行uvicorn main:app --reload访问http://127.0.0.1:8000/docs即可在交互式文档中测试所有用户接口。