03. 开发专业信息增删改查功能(一)

191 字约 1 分钟读完365 次阅读更新于 2026/5/3

怎么做?

  1. 创建数据库表 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='专业信息';
  1. 创建 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'
  1. 开始写接口
  • 新增数据:定义 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()