实现查询角色的功能
完整代码:
@router.get("/", summary="角色查询")
def get_role(
page: int = 1,
size: int = 20,
name: str = "",
nickname: str = "",
db: SASession = Depends(get_db),
):
"""
分页查询文件
"""
# 查询
query = select(FastZdpRoleModel)
# 根据关键字查询
if name:
query = query.where(FastZdpRoleModel.name.like(f"%{name}%"))
if nickname:
query = query.where(FastZdpRoleModel.nickname.like(f"%{nickname}%"))
# 统计总数
total_count = len(db.exec(query).all())
# 分页
query = query.offset((page - 1) * size).limit(size)
# 执行查询
results = db.exec(query).all()
# 返回
return {
"count": total_count,
"data": results,
}
这里面有个非常关键的技术,就是SQLModel如何实现like查询。
query = query.where(FastZdpRoleModel.name.like(f"%{name}%"))
测试效果如下:
根据ID查询角色
初步设计的代码如下:
@router.get("/{id}/", summary="根据ID查询角色")
def get_role_id(
id: int,
db: SASession = Depends(get_db),
):
role = db.exec(select(FastZdpRoleModel).where(FastZdpRoleModel.id == id)).first()
if not role:
raise HTTPException(status_code=404, detail="角色不存在")
return role
先查询所有的角色:
再根据ID查询角色:
初步来看,这个接口是没有什么问题的。
修改角色
在实现修改角色的接口之前,先修改一下角色表设计,让角色名是唯一的。
class FastZdpRoleModel(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True, unique=True)
nickname: str
修改角色的接口应该指定ID,角色名和角色昵称。
初步设计接口代码如下:
@router.put("/{id}/", summary="根据ID修改角色")
def update_role_id(
id: int,
name: str = Body(str, min_length=2, max_length=36),
nickname: str | None = Body(None),
db: SASession = Depends(get_db),
):
role = db.exec(select(FastZdpRoleModel).where(FastZdpRoleModel.id == id)).first()
if not role:
raise HTTPException(status_code=404, detail="角色不存在")
if name:
role.name = name
if nickname:
role.nickname = nickname
db.add(role)
db.commit()
db.refresh(role)
return role
先根据ID查询用户:
接着根据ID修改角色:
再根据ID查询角色。
从结果来看已经修改成功了。
不过这里还有个问题,就是要修改的角色名不能和已经存在的角色名重复,这点需要校验。
优化修改角色接口
主要增加校验要修改的角色名不能和已有的角色名重复的判断。
优化后的接口代码如下:
@router.put("/{id}/", summary="根据ID修改角色")
def update_role_id(
id: int,
name: str = Body(str, min_length=2, max_length=36),
nickname: str | None = Body(None),
db: SASession = Depends(get_db),
):
role = db.exec(select(FastZdpRoleModel).where(FastZdpRoleModel.id == id)).first()
if not role:
raise HTTPException(status_code=404, detail="角色不存在")
if name and name != role.name:
tmp_role = db.exec(select(FastZdpRoleModel).where(FastZdpRoleModel.name == name)).first()
if tmp_role:
raise HTTPException(status_code=400, detail="角色名已存在")
role.name = name
if nickname:
role.nickname = nickname
db.add(role)
db.commit()
db.refresh(role)
return role
我们来测一下!!!
先查询所有角色:
目前只有一个角色是无法测的,我们加一个角色。
再次查询所有的角色:
此时,我们把id为1的test改为test2试试。因为test2是已经存在的。
修改不成功:
那我们修改成一个不存在的角色名试试,比如test3。
成功了,我们再去查询所有角色试试:
从结果来看,这个接口基本开发完毕了。
根据ID删除角色的接口
接下来,我们开发根据ID删除角色的接口。
初步设计如下:
@router.delete("/{id}/", summary="根据ID删除角色")
def delete_role_id(
id: int,
db: SASession = Depends(get_db),
):
role = db.exec(select(FastZdpRoleModel).where(FastZdpRoleModel.id == id)).first()
if not role:
raise HTTPException(status_code=404, detail="角色不存在")
db.delete(role)
db.commit()
return role
接着我们先查询所有角色:
再删除id为1的角色:
此时我们再次查询所有角色:
可以发现,id为1的数据已经被成功删除了。
如果我们再次删除id为1的角色,则会报错:
总结
本篇文章介绍了如何使用FastAPI+SQLModel开发角色的增删改查接口。
如果你对Python感兴趣,想要完整的源码或者一对一的教学,欢迎留言或者私信。