目录
3.在crud文件夹里面创建文件,封装操作数据库的方法(写mapper)
4.在路由处理函数里面调用crud封装好的方法,响应结果给前端(在controller中,使用mapper)
5.将新闻路由routers/news.py,挂载到main,py
一.具体实现步骤
1.模块化路由(新建一个controller)
在routers目录(我们之前创建的目录),新建一个news.py文件,专门存放新闻相关的接口

python
#1.导入APIRouter
from fastapi import APIRouter
#2.创建APIRouter实例
router = APIRouter(prefix="/api/news", tags=["news"])
# "获取新闻分类"
@router.get("/categories")
async def getCategories(skip: int = 0, limit: int = 100):
# 先模拟一下返回结果就行
return {
"code": 200,
"message": "success",
"data": "新闻分类列表"
}
测试效果:
(我们以后测试后端接口,可以直接在docs接口文档中测试就行,无需额外使用ApiFox或者postman来测试了)

2.定义模型类(新建一个实体类)

python
from datetime import datetime
from sqlalchemy import DateTime, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
# 创建基类(存放一些共用的字段,供不同的表使用)
# 举例:新闻表、新闻分类表,都有创建时间、更新时间,这俩字段就能拎出来
class Base(DeclarativeBase):
created_at: Mapped[datetime] = mapped_column(
DateTime,
default=datetime.now(),
comment="创建时间"
)
updated_at: Mapped[datetime] = mapped_column(
DateTime,
default=datetime.now(),
comment="更新时间"
)
# 创建"新闻分类"表的模型类
class Category(Base):
# 表名
__tablename__ = "news_category"
# 各个字段
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment="分类id")
name: Mapped[str] = mapped_column(String(50), unique=True, nullable=False, comment="分类名称")
sort_order: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="排序")
# toString
def __repr__(self):
return f"<Category(id={self.id}, name={self.name}, sort_order={self.sort_order})>"
3.在crud文件夹里面创建文件,封装操作数据库的方法(写mapper)

python
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from models.news import Category
# 定义mapper:查询新闻分类
async def getCategories(db: AsyncSession, skip: int = 0, limit: int = 100):
#1.定义sql语句
stmt = select(Category).offset(skip).limit(limit)
#2.让db执行sql语句
result = await db.execute(stmt)
#3.获取执行结果并返回
return result.scalars().all()
4.在路由处理函数里面调用crud封装好的方法,响应结果给前端(在controller中,使用mapper)

python
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from config.db_conf import get_db
from crud import news
#2.创建APIRouter实例
router = APIRouter(prefix="/api/news", tags=["news"])
# "获取新闻分类"
@router.get("/categories")
async def getCategories(db:AsyncSession = Depends(get_db), skip: int = 0, limit: int = 100):
#1.从数据库查询
categories = await news.getCategories(db,skip,limit)
#2.返回结果
return {
"code": 200,
"message": "查询新闻分类成功",
"data": categories
}
解读:
①db:AsyncSession = Depends(get_db)这是在注入数据库会话,从而才能执行sql,而且这个get_db获取数据库会话的方法,就是我们在config/db_conf.py文件中提前写好的。
②from crud import news这是导入我们刚刚定义的mapper
5.将新闻路由routers/news.py,挂载到main,py

二.运行项目,测试效果
直接打开http://127.0.0.1:8000/docs,即项目的接口文档。

响应结果如下
python
{
"code": 200,
"message": "查询新闻分类成功",
"data": [
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 1,
"created_at": "2026-02-07T19:05:16",
"id": 1,
"name": "头条"
},
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 2,
"created_at": "2026-02-07T19:05:16",
"id": 2,
"name": "社会"
},
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 3,
"created_at": "2026-02-07T19:05:16",
"id": 3,
"name": "国内"
},
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 4,
"created_at": "2026-02-07T19:05:16",
"id": 4,
"name": "国际"
},
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 5,
"created_at": "2026-02-07T19:05:16",
"id": 5,
"name": "娱乐"
},
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 6,
"created_at": "2026-02-07T19:05:16",
"id": 6,
"name": "体育"
},
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 7,
"created_at": "2026-02-07T19:05:16",
"id": 7,
"name": "科技"
},
{
"updated_at": "2026-02-07T19:05:16",
"sort_order": 8,
"created_at": "2026-02-07T19:05:16",
"id": 8,
"name": "财经"
}
]
}