总体步骤
- 配置config,主要配置数据库连接信息、模型类等
- 配置模型类
- 配置“请求数据结构”、“响应数据结构”
- 注册Tortoise ORM
- 配置请求接口
配置Config
config.py
# Tortoise ORM 配置,包含数据库连接和模型信息
TORTOISE_ORM = {
"connections": {
# "default" 是默认连接名称,MySQL 连接使用 "mysql://<用户名>:<密码>@<主机>:<端口>/<数据库名称>"
"default": "mysql://root:123456@localhost:3306/resume"
},
"apps": {
"models": {
# "models" 表示模型的 Python 模块路径
"models": ["models"],
# 指定默认的数据库连接为上面配置的 "default"
"default_connection": "default",
}
},
}
配置模型类
models.py
from tortoise import fields, models
# User 类定义了数据库中的 "users" 表结构
class User(models.Model):
# 定义主键字段 "id",类型为整型,自增
id = fields.IntField(pk=True)
# "name" 字段,字符串类型,最大长度 50
name = fields.CharField(max_length=50)
# "email" 字段,字符串类型,最大长度 100,唯一值
email = fields.CharField(max_length=100, unique=True)
class Meta:
# 表示该模型对应数据库中的 "users" 表
table = "users"
# 定义一个 __str__ 方法,便于调试和打印用户信息
def __str__(self):
return self.name
配置请求和响应结构
from pydantic import BaseModel
# UserCreate 模式, 用于创建用户的请求数据结构
class UserCreate(BaseModel):
name: str # 用户名,字符串类型
email: str # 用户邮箱,字符串类型
# UserResponse 模式,包含用户的 id,表示拥护数据的响应结构
class UserResponse(UserCreate):
id: int
注册 Tortoise ORM 和 配置请求接口
from fastapi import FastAPI, HTTPException
from tortoise.contrib.fastapi import register_tortoise
from config import TORTOISE_ORM
from models import User
from schemas import UserResponse, UserCreate
# 创建 FastAPI 应用实例
app = FastAPI()
# 注册并初始化 Tortoise ORM
register_tortoise(
app,
config=TORTOISE_ORM, # 加载配置文件中的 Tortoise ORM 配置
generate_schemas=True, # 为 True 时,应用启动时会自动生成数据库表结构
add_exception_handlers=True, # 自动添加异常处理
)
@app.post("/users/", response_model=UserResponse)
async def create_user(user: UserCreate):
"""
创建用户的异步函数,接收 UserCreate 模式的请求数据。
使用 Tortoise ORM 的 User.create() 方法将数据写入数据库。
"""
db_user = await User.create(**user.model_dump()) # 使用 ** 解包,将 UserCreate 数据作为关键字参数传入
return db_user # 返回创建的用户对象
# 获取指定用户的 API 路由,使用 HTTP GET 方法,返回类型为 UserResponse
@app.get("/users/{user_id}", response_model=UserResponse)
async def get_user(user_id: int):
"""
根据用户 ID 查找用户,返回用户数据。
如果用户不存在,则返回 404 错误。
"""
# 使用 Tortoise ORM 的 filter() 和 first() 方法进行查询
user = await User.filter(id=user_id).first()
if user is None:
# 如果用户不存在,则抛出 HTTPException,状态码 404
raise HTTPException(status_code=404, detail="User not found")
return user # 返回找到的用户对象