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

news2024/10/5 14:03:35

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

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

原来的代码:

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://www.coloradmin.cn/o/1648319.html

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

相关文章

# Maven 下载安装与配置

Maven 下载安装与配置 一、前言: 1、Maven 简介: Apache Maven是一个( 特别是 Java 编程 )项目管理及自动构建工具,由 Apache 软件基金会所提供。基于项目对象模型( 缩写:POM )概念…

【Pytorch】4.torchvision.datasets的使用

什么是torchvision.datasets、 是pytorch官方给出的关于cv领域的训练数据集,我们可以用官方提供的数据集进行学习与训练 如何查看 我们可以进入Pytorch官网 切换一下版本到v0.9.0,就可以看到官方给出的数据集了 同时也有官方训练好的cv模型可以供我们…

华为手机怎么录屏?3个简单方法教会你

随着智能手机的普及,录屏功能已成为许多用户日常操作中的必备工具。华为手机作为市场上的热门品牌,为用户提供了多种录屏方法,以满足不同场景和需求。 那么华为手机怎么录屏?本文将详细介绍3个华为手机的几种录屏方法&#xff0c…

容器Docker:轻量级虚拟化技术解析

引言 随着云计算和虚拟化技术的飞速发展,容器技术以其轻量级、高效、可移植的特性,逐渐成为了软件开发和部署的新宠。在众多容器技术中,Docker以其简单易用、功能强大的特点,赢得了广泛的关注和应用。本文将全面介绍Docker的基本概…

普通组件的注册-局部注册和全局注册

目录 一、局部注册和全局注册-概述 二、局部注册的使用示例 三、全局注册的使用示例 一、局部注册和全局注册-概述 组件注册有两种方式: 局部注册:只能在注册的组件内使用。使用方法:创建.vue文件,在使用的组件内导入并注册。…

浅谈智能电气火灾监控系统的设计及应用

摘要:致电气火灾的原因是多方面的,主要成因包括漏电、绝缘层老化、短路、电火花密集、接地发生故障、电气设备自然、接触不良和电流超负荷等。文章分析电气火灾的成因,并探索电气火灾监控系统的设计方案与注意事项。 关键词:电气…

揭秘APP广告变现:从零到月入过万的秘密

在移动互联网的时代,APP的开发和运营成为了一个热门的行业。然而,对于许多开发者来说,如何通过APP广告变现,实现收益最大化,是一个值得深思的问题。今天,就让我们通过一个小故事,一起来探讨一下…

助贷客户管理系统:助力助贷公司轻松实现30%增长目标!

为了解决传统助贷公司在业务过程中遇到的痛点,盛鑫优创科技特别设计了一款定制化的解决方案——"鑫鹿助贷客户管理系统",以满足助贷行业的独特需求: 传统助贷公司的老板们在做业务的的过程中都有这些痛点: 1、没有一个…

25_Scala集合Tuple

文章目录 tuple1.元组定义2.Tuple元素访问3.如果元素的len2,称之为键值对对象,也称之为对偶元组4.补充上节Map5.Map集合遍历6.集合之间相互转化 tuple 概念:scala语言采用特殊的方式将无关的数据作为一个整体,组合在一起’ 1.元…

综合性SCI期刊,中科院3区,IF=4+,征稿范围广泛!

一、期刊名称 Scientific Reports 二、期刊简介概况 期刊类型:SCI 学科领域:综合性期刊 影响因子:4.6 中科院分区:3区 出版方式:开放出版 版面费:$2590 三、期刊征稿范围 期刊发表来自自然科学、心…

EXCEL——VLOOKUP函数

一、VLOOKUP函数的语法 VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup]) lookup_value 需要在数据表首列进行搜索的值,可以是数值,引用或字符串 table_array 要在其中搜索数据的文字、数字或逻辑值表,可以是对区域或…

Day 41 343.整数拆分 96.不同的二叉搜索树

整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 …

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注:Vite 需要 Node.js 版本 18,20 1.选定路径后再cmd输入创建…

深度学习之基于Resnet50卷积神经网络脊柱骨折CT影像图片诊断系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 脊柱骨折是骨科中一种常见的损伤类型,准确的诊断对于患者的治疗和康复至关重要。传统的脊…

SPD1179 电路设计---汽车电机控制设计

概述 SPD1179 是旋智针对汽车应用推出的一颗高度集成的片上系统(SOC) 微控制器,内置 32 位高性能 ARMCortex-M4F 内核,最高 100MHz 的软件可编程时钟频率, 32KB SRAM, 128KB 嵌入式 FLASH, 1KB …

高级DBA教你达梦8国产数据库MergeInto批量插入并忽略主键重复报错特殊用法(达梦官方手册没有的内容)

高级DBA教你达梦8国产数据库MergeInto批量插入并忽略主键重复报错特殊用法(达梦官方手册没有的内容) 一、达梦8国产数据库简介 达梦 8 是一款由武汉达梦数据库有限公司基于 C/C语言开发的国产关系型数据库,有支持 X86 和 ARM 平台的版本&am…

【数据结构】 顺序表专题

目录 1.顺序表的概念及结构 1.1线性表 1.2顺序表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 1.顺序表的概念及结构 1.1线性表 线性表(Linear List)是数据结构中的一种基本结构,它是一个具有n个数据元素的有限序列。线性表的特点是数…

triton之fused attention

附录 【BBuf的CUDA笔记】十五,OpenAI Triton入门笔记三 FusedAttention - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/684557290图解大模型计算加速系列:FlashAttention V1,从硬件到计算逻辑 - 知乎 (zhihu.com)

MongoDB(四):条件操作符

条件操作 1、概述2、比较操作2.1、大于操作符-$gt2.2、大于等于操作符-$gte2.3、小于——$lt2.4、小于等于——$lte2.5、范围查询 3、总结 大家好,我是欧阳方超,可以扫描下方二维码关注我的公众号“欧阳方超”,后续内容将在公众号首发。 1、…

架构师:搭建Spring Security、OAuth2和JWT 的安全认证框架

1、简述 Spring Security 是 Spring 生态系统中的一个强大的安全框架,用于实现身份验证和授权。结合 OAuth2 和 JWT 技术,可以构建一个安全可靠的认证体系,本文将介绍如何在 Spring Boot 中配置并使用这三种技术实现安全认证,并分析它们的优点。 2、Spring Security Spri…