03. 开发专业信息增删改查功能(一)
怎么做?
- 创建数据库表 major
CREATE TABLE `major` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '专业代码',
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称',
`college` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '所属学院',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='专业信息';
- 创建 Model
class Major(Model):
"""专业模块"""
id = fields.IntField(pk=True, null=False)
no = fields.CharField(max_length=255, null=True)
name = fields.CharField(max_length=255, null=True)
college = fields.CharField(max_length=255, null=True)
class Meta:
table = 'major'
- 开始写接口
- 新增数据:定义 CreatePydantic 接受数据
MajorCreatePydantic = create_model(
"MajorCreatePydantic",
**{
name: (Optional[field.annotation], None)
for name, field in MajorPydantic.model_fields.items()
}
)
要定义 router:router = APIRouter(prefix="/major")
通过 router 帮我们创建一个 post 请求,执行数据库操作,注意是 aysnc、await 异步操作的
@router.post("/add")
aysnc def add(major_create_pydantic: MajorCreatePydantic):
# 写数据库插入逻辑
create_data = major_create_pydantic.model_dump() # 转换数据模型
await Major.create(**create_data)
return Result.success()
然后你可以在数据库操作的那里。配置一个 try except 处理数据库的异常信息
本节课代码
from typing import Optional
from fastapi import APIRouter
from pydantic import create_model, BaseModel
from tortoise.contrib.pydantic import pydantic_model_creator
from common.exception_handler import CustomException
from common.result import Result
from models import Major
router = APIRouter(prefix="/major")
MajorPydantic = pydantic_model_creator(Major)
MajorCreatePydantic = create_model(
"MajorCreatePydantic",
**{
name: (Optional[field.annotation], None)
for name, field in MajorPydantic.model_fields.items()
}
)
# 新增
@router.post("/add")
async def add(major_create_pydantic: MajorCreatePydantic):
# 将参数转换成 字典数据
create_data = major_create_pydantic.model_dump(exclude_unset=True, exclude={"id"})
await Major.create(**create_data) # no=xxx,name=xxx,college=xxx
return Result.success()
# 更新
@router.put("/update")
async def add(major_create_pydantic: MajorCreatePydantic):
if major_create_pydantic.id is None:
raise CustomException("缺少参数ID")
# 将参数转换成 字典数据
update_data = major_create_pydantic.model_dump(exclude_unset=True, exclude={"id"})
try:
await Major.filter(id=major_create_pydantic.id).update(**update_data) # no=xxx,name=xxx,college=xxx
except Exception as e:
print(e)
raise CustomException("数据库操作异常")
return Result.success()