使用sqlmodel实现唯一性校验2,插入之前检查是否已存在

虽然之前添加唯一性校验的方法能够解决数据唯一的问题,但是如果忘了处理异常,则可能会导致程序崩溃。

在此基础上,我们可以在插入数据之前检查该数据是否已存在。

原来的代码:

from sqlmodel import Field, Session, SQLModel, create_engine# 声明模型
class User(SQLModel, table=True):id: int | None = Field(default=None, primary_key=True)# 不能为空,必须唯一name: str = Field(nullable=False, unique=True)age: int | None = None# 创建引擎
engine = create_engine("sqlite:///database.db", echo=True)# 创建表
SQLModel.metadata.create_all(engine)# 创建两个名字重复的用户
zs_1 = User(name="张三", age=22)
zs_2 = User(name="张三", age=23)with Session(engine) as session:session.add(zs_1)session.add(zs_2)session.commit()

我们改写如下:

from sqlalchemy import select
from sqlmodel import Field, Session, SQLModel, create_engine# 声明模型
class User(SQLModel, table=True):id: int | None = Field(default=None, primary_key=True)# 不能为空,必须唯一name: str = Field(nullable=False, unique=True)age: int | None = None# 创建引擎
engine = create_engine("sqlite:///database.db", echo=True)# 初始化表
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)# 添加用户的方法
def add_user(name: str, age: int):user = User(name=name, age=age)with Session(engine) as session:# 检查是否已存在statement = select(User).where(User.name == name)results = session.exec(statement)db_user = results.first()print("查询结果:", db_user)if db_user is not None:print(f"用户 {name} 已存在")return# 执行添加session.add(user)session.commit()# 创建两个名字重复的用户
add_user("张三", 23)
add_user("张三", 24)# 查询所有用户
with Session(engine) as session:statement = select(User)results = session.exec(statement).all()print(results)

执行结果如下:
在这里插入图片描述

第一次的时候,查询出来的是个None,第二个则提示已存在。

用这种方案,能够更安全的解决数据唯一性的问题。

当然,在模型中声明唯一性约束也是必要的,可以方案用户跳过接口,直接以操作数据库的方式对表进行重复数据写入。

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

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

相关文章

LINUX 入门 6

LINUX 入门 6 day10 20240505 耗时:41min day10 20240506 耗时:155min 课程链接地址 第6章 DNS协议与请求 1 DNS协议分析与项目介绍 自己去看教程 快速扫了一下,还是结合实践去看概念有感觉 回答以下几个问题: dns作用dns分层…

PLC学习笔记

PLC学习笔记 前言一、一些基操知识二、GX works2编程2.1 位逻辑1.2 中间寄存器1.3 PLC的扫描方式 总结 前言 我这个人真的是太渴望知识了~ 一、一些基操知识 一般X表示输入,Y表示输出。一般八个为一组X0~X7M表示中间寄存器,M0~M7时间T、计数C 二、GX …

Centos 7.9 配置VNCServer实现远程vnc连接

文章目录 1、Centos安装图形界面1.1、安装X Windows System图形界面1.2、安装GNOME图形界面 2、VNC SERVER配置2.1、VNC SERVER安装2.2、VNC SERVER配置1)创建vnc配置文件2)修改配置文件内容3)完整配置文件参考 2.3、设置vnc密码2.4、配置防火…

C#语言核心

一、面向对象基本概念 万物皆对象,用程序来抽象(形容)对象,用面向对象的思想来编程 用中文去形容一类对象,把一类对象的共同点提取出来,然后用程序语言把它翻译过来,带着对象的概念在程序中使…

OCR文本识别模型CRNN

CRNN网络结构 论文地址:https://arxiv.org/pdf/1507.05717 参考:https://blog.csdn.net/xiaosongshine/article/details/112198145 git:https://github.com/shuyeah2356/crnn.pytorch CRNN文本识别实现端到端的不定长文本识别。 CRNN网络把包含三部分&…

IOS离线打包uniapp的信息时报错如下的解决方法

IOS离线打包uniapp的信息时报错如下的解决方法 问题描述: Extract app intents metadata 0.1 seconds XExtractAppIntentsMetadata(in target HBuilder from project HBuilder-Hello)cd /Users/whb/space/vpt/vptios/HBuilder-Hello/Applications/Xcode.app/Conte…

分布式与一致性协议之ZAB协议(六)

ZAB协议 成员发现 成员发现是通过跟随者和领导者交互来完成的,目标是确保大多数节点对领导者的关系没有异议,也就是确立领导者的领导地位。成员发现的实现流程如图所示。 1.领导者选举结束,节点进入跟随者状态或者领导者状态后&#xff0…

如何获得一个Oracle 23ai数据库(RPM安装)

准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 方法包括3种,本文介绍第2种: Virtual ApplianceRPM安装Docker RPM安装支持Linux 8和Linux 9。由于官方的Vi…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者:Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能,优先考虑攻击,而不是警报。 传统的安全信息与事件管理系统(SIEM)在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

【busybox记录】【shell指令】join

目录 内容来源: 【GUN】【join】指令介绍 【busybox】【join】指令介绍 【linux】【join】指令介绍 使用示例: 打印两个文件的共有行 - 默认输出 可以对字母排序 可以对数字排序 可以对字符串排序 打印两个文件的共有行 - 输出文件1或者文件2中…

SQL注入实例(sqli-labs/less-1)

初始网页 从网页可知传递的参数名为 id,并且为数字类型 1、得知数据表有多少列 1.1 使用联合查询查找列数(效率低) http://localhost/sqli-labs-master/Less-1/?id1 union select 1,2 -- 1.2 使用order by查找列数(效率高&…

【MySQL】MySQL基本知识点

目录 1.SQL分类: 2.DDL-数据库操作 3.DDL-表操作-创建 4.DDL-表操作-查询 5.DDL-表操作-数据类型 6.DDL-表操作-修改 1.SQL分类: 2.DDL-数据库操作 3.DDL-表操作-创建 注意:里面的符号全部要切换为英文状态 4.DDL-表操作-查询 5.DDL…

网络安全之动态路由入门

动态路由协议有几种:RIP,OSPF,EIGRP,ISIS,BGP 动态路由工作原理: 例如: 若A区域运行的协议与B中的不同,数据从1到4走A区域还是走B区域,则看A,B两区域的优先级(priority preference或AD——管理距离&#…

个股期权是什么期权?个股期权什么时候推出?

今天期权懂带你了解个股期权是什么期权?个股期权什么时候推出?期权也称选择权,是指期权的买方有权在约定的期限内,按照事先确定的价格,买入或卖出一定数量某种特定商品或金融指标的权利。 个股期权是什么期权&#xff…

后端开发面经系列 -- 滴滴C++一面面经

滴滴C一面面经 公众号:阿Q技术站 来源:https://www.nowcoder.com/feed/main/detail/38cf9704ef084e27903d2204352835ef 1、const在C和C区别,const定义的类成员变量如何初始化? 区别 C中的const: 在C中,c…

【Redis分布式缓存】分片集群

Redis 分片集群 搭建分片集群 集群结构 分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下: 这里我们会在同一台虚拟机中开启6个redis实例&…

计算机毕业设计Python+Vue.js天气预测系统 中国气象质量采集与可视化 天气数据分析 天气可视化 天气大数据 天气爬虫 大数据毕业设计

摘要 随着科技技术的不断发展,人民物质生活质量不断提高,我们越来越关注身边的气象、空气等地理环境。对于普通居民我们会选择合适的气象进行出游,提高精神层面的生活质量;对于企业会关注气象变换状况,来定制相关的生产…

91、动态规划-不同的路径

思路: 首先我们可以使用暴力递归解法,无非就是每次向下或者向右看看是否有解法,代码如下: public class Solution {public int uniquePaths(int m, int n) {return findPaths(0, 0, m, n);}private int findPaths(int i, int j,…

解决Python中的 `ModuleNotFoundError: No module named ‘fcmeans‘` 错误

ModuleNotFoundError: No module named fcmeans 解决Python中的 ModuleNotFoundError: No module named fcmeans 错误如何解决这个错误fcmeans 库简介应用实例 解决Python中的 ModuleNotFoundError: No module named fcmeans 错误 在进行数据科学或机器学习项目时,…

【CTF Web】XCTF GFSJ0477 backup Writeup(备份文件+源码泄漏+目录扫描)

backup X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧! 解法 使用 dirsearch 扫描目录。 dirsearch -u http://61.147.171.105:49361/下载: http://61.147.171.105:64289/index.php.bak打开 index.php.bak&am…