FastAPI+SQLModel开发角色的增删改查接口实战,附完整代码

news2024/11/14 13:29:00

实现查询角色的功能

完整代码:

@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感兴趣,想要完整的源码或者一对一的教学,欢迎留言或者私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试被问到关于软件测试计划方面的面试题,怎么样回答好。

1、软件的评审一般由哪些人参加?其目的是什么? 参考答案: 在正式的会议上将软件项目的成果(包括各阶段的文档、产生的代码等)提交给用户、客户或有关部门人员对软件产品进行评审和批准。其目的是找出可能影响软件产品质量、开发过程、维护工作的适用性和环境方面…

系统编程-常用工具2

常用工具(2) 目录 常用工具(2) 一、gdb调试工具 如果想进行调试 编译程序的时候 二、makefile 脚本编译工具 1、makefile是什么? 2、使用makefile -- 安装make指令 -- make指令的使用 -- Makefile文件的书写…

面向新人的 Java 面试问题(51-100)

51. 使用 new() 创建 String 与创建文字有何不同? 使用 new() 的字符串与文字不同,因为当我们声明字符串时,它将元素存储在堆栈内存中,而当使用 new() 声明时,它会在堆内存中分配动态内存。即使存在相同内容的对象&am…

Xv6——物理分配器

对应文件:kalloc.c 物理内存布局 在Xv6中,物理内存大小是固定的,为128MB。物理内存起止也是固定的,由宏 KERNVASE 和 宏 PHYSTOP 定义。系统启动时,会把内核的代码加载到物理内存当中去;因此,可…

Android-自适用高度的ViewPager

需求 在项目中,我们常常遇到需要动态调整 ViewPager 的高度,以适应其内容大小的需求。默认情况下,ViewPager 的高度是固定的,无法根据每个页面的内容高度进行调整。这会导致在内容高度不一致时,出现不必要的空白区域或…

Cmake基础教程--第2章:打印信息和变量操作

Cmake基础教程--第2章:打印日志和变量操作 概述message打印日志打印一些CMake自带的信息 变量操作set操作list方法添加元素获取长度查找元素删除元素其他操作 概述 CMake项目时基于一个名为 CMakeLists.txt 的文件来构造的,注意大小写不能拼写错误。我们…

线程回收以及线程的问题处理

一、线程结束 1.1、pthread_exit 本身表示结束线程 如果用在main函数中 表示结束主线程 主线程结束并不表示进程 此时执行逻辑,主线程执行流结束,进程会在其余线程都结束后,结束 1.2、return 从线程中返回 线程执行函数执行结束&#x…

让回忆鲜活如初:13.3寸彩色墨水屏电子相框震撼上市

在这个数字化时代,我们习惯了在社交媒体上分享生活的点滴,但那些珍贵的记忆是否也能以更直观的方式呈现?近日,一款全新的13.3寸彩色墨水屏电子相框正式上市,它将以独特的方式让您的回忆鲜活如初。 高清彩色墨水屏&…

三维建模软件:地理信息与遥感领域的智慧构建者

在地理信息与遥感技术的广阔舞台中,建模软件如同一位卓越的建筑师,以数据为砖瓦,智慧为水泥,构建出一个又一个又一个逼真、动态的虚拟世界。本文将深入探究其技术核心、应用实例、未来趋势,揭示建模软件如何在地理信息…

论文干货|AI一键生成论文的AI工具!附使用攻略!速速码住!

在当前的学术研究和写作环境中,AI技术的应用已经变得越来越普遍。特别是在论文写作方面,许多学生和研究人员都在寻找能够提高效率、简化流程的工具。千笔-AIPassPaPer是一款备受推荐的AI论文生成工具,它不仅功能全面,而且用户体验…

Windows、Ubuntu安装mysql

今天我们来学习一下如何在Windows、Ubuntu安装mysql。 Windows安装mysql 第一步:在官网找到需要安装的mysql版本,下载 第二步:下载后打开安装包,进行安装。 点击 “Next”: 默认就行,单击next: 单击“Excute” 等…

Postgresql导入矢量数据

前期准备 工具:PgAdmin,postgis-bundle Postgres安装和postgis安装可以百度别的教程。 创建数据库添加扩展 如图,使用PgAdmin创建名为shp的数据库,并在扩展item中添加postgis扩展。 添加扩展方法可以用查询工具输入以下sql语句&…

贪吃蛇(C语言详解)

贪吃蛇游戏运行画面-CSDN直播 目录 贪吃蛇游戏运行画面-CSDN直播 1. 实验目标 2. Win32 API介绍 2.1 Win32 API 2.2 控制台程序(Console) 2.3 控制台屏幕上的坐标COORD 2.4 GetStdHandle 2.5 GetConsoleCursorlnfo 2.5.1 CONSOLE_CURSOR_INFO …

免费通配符泛域名SSL证书全自动申请、更新、续期、部署,支持部署到阿里云、腾讯云、ssh主机

CertD:全自动SSL证书管理平台 CertD是一款创新性的开源工具,专注于提供免费且全自动化的SSL证书申请及更新服务。它的命名灵感来源于Linux守护进程的命名方式,“D”代表证书守护进程(Certificate Daemon),…

SpringBoot-读取配置文件内容

目录 前言 主页(端口号默认8080) 1 Value 注解 引用变量的使用 2 Environment 对象 3 ConfigurationProperties (配置内容和对象,进行相互绑定) 前言 读取配置文件有3 种方式 (1) Value注解 (2) Environm…

基于springboot的网上服装商城

TOC springboot182基于springboot的网上服装商城 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性…

C++竞赛初阶L1-11-第五单元-for循环(25~26课)514: T454425 奥运奖牌计数

题目内容 2008 年北京奥运会,A 国的运动员参与了 n 天的决赛项目 (1≤n≤100)。现在要统计一下 A 国所获得的金、银、铜牌数目及总奖牌数。输入第 1 行是 A 国参与决赛项目的天数 n,其后 n 行,每一行是该国某一天获得的金、银、铜牌数目&…

C++ stack与queue的使用与简单实现

目录 0. 适配器 1. stack的简要介绍 2. stack的简单使用 3. queue的简要介绍 4. queue的简单使用 STL标准库中stack和queue的底层结构 deque简单介绍 5. stack的模拟实现 6. queue的模拟实现 0. 适配器 在文章开始前我们先了解一下适配器的概念 适配器是一种设计模式(设计…

【第二节】80x86汇编-寄存器和标志位

目录 前言 一、汇编相关概念 1.1 数据表示与类型 1.2 汇编语言的构成 1.3 存储器及指令、数据 1.4 存储单元 1.5 CPU对存储器的读写操作 1.6 CPU读写内存单元的过程 1.7 intel CPU发展 1.8 8086 内部结构 二、寄存器 2.1 寄存器概览 2.2 32位寄存器 2.3 16位寄存器…

浅谈C语言预处理

文章目录 预处理1、预定义符号2、#define定义标识符和宏A、#define定义标识符B、#define定义宏a、宏的定义b、宏的使用c、宏和函数 3、条件编译4、头文件包含A、两种包含形式B、防止头文件被重复包含 预处理 什么是预处理?预处理是C语言编译的三个过程(…