sqlmodel实现唯一性校验3,检查多列同时重复

news2024/12/31 6:13:58

之前的方案虽然能够解决重复性问题,但是没有覆盖到多列同时重复的情况。

比如,我们可以认为用户名是可以重复的。但是用户名和年龄不能同时重复,那么这种情况该怎么解决呢?

之前的代码如下:

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)


这里我选择在查询条件上加一个条件,查询的时候根据name和age同时查询。
代码改写如下:

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)
    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).where(User.age == age)
        statement = select(User).where(User.name == name, User.age == age)
        results = session.exec(statement)
        db_user = results.first()
        print("查询结果:", db_user)

        if db_user is not None:
            print(f"用户 {name}, {age} 已存在")
            return

            # 执行添加
        session.add(user)
        session.commit()


# 创建两个名字重复的用户
add_user("张三", 23)
add_user("张三", 24)
add_user("张三", 24)  # 期望第三个才重复

# 查询所有用户
with Session(engine) as session:
    statement = select(User)
    results = session.exec(statement).all()
    print(results)

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

前两次的时候都没有重复,第三次重复了,所以没有写入。

注意,这种情况需要将原来模型中name的unique约束去掉才行。

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

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

相关文章

低优先级线程可能会使用 100% CPU

经常会有人问我这样的问题: 我将一个线程设置为低优先级,当我的应用程序运行起来之后,我在任务管理器中看到应用程序占满了接近 100% 的 CPU,这就有点奇怪了,难道低优先级设定没有起作用? 我想指出的是&a…

Pytorch入门实战 P09-YOLOv5里面的Backbone模块搭建网络

目录 1、YOLOv5的模型图。 2、BackBone简单介绍。 3、YOLOv5的Backbone文件。 4、YOLOv5Backbone的code部分 5、完整的code部分 6、结果展示 (1)Adam优化器 (2)SGD优化器 🍨 本文为🔗365天深度学习…

羊大师解析,鲜为人知的羊奶冷知识

羊大师解析,鲜为人知的羊奶冷知识 羊奶的脂肪球更小:相较于牛奶,羊奶中的脂肪球直径更小,这有助于其更快地被人体消化和吸收。 羊奶含有更多的中链脂肪酸:羊奶中含有较多的中链脂肪酸(MCT)&am…

WiFine通信与Wi-sun通信对比

调制速率 WiFine通信:(G)FSK 50Kbps~500Kbps ;LoRa 5Kbps~37.5Kbps Wi-Sun通信:(G)FSK 50Kbps~300Kbps ;QPSK/OFDM 计划中… 2、协议简介 WiFine通信:为低成本、低功耗、移动设备倾力打造 的轻量级、分布式无线移动…

Stateflow基础知识笔记

01--Simulink/Stateflow概述 Stateflow是集成于Simulink中的图形化设计与开发工具,主要 用于针对控制系统中的复杂控制逻辑进行建模与仿真,或者说, Stateflow适用于针对事件响应系统进行建模与仿真。 Stateflow必须与Simulink联合使用&#…

阿赵UE引擎C++编程学习笔记——HelloWorld

大家好,我是阿赵。   从这一篇开始学习虚幻引擎的C编程。   学习所有编程好像都应该从HelloWorld开始,所以我这里也不例外。不过为了能打印出HelloWorld,需要做的事情还不少。不过到了能打印出HelloWorld的时候,我感觉学习的过…

使用DxTex.exe工具处理DDS图片

一.DxTex.exe DDS文件:基于Direct3D引擎的纹理图片格式。 DxTex.exe:基于Direct3D引擎开发的DDS文件处理工具,文件分辨率修改,文件minmap修改。 DxTex.exe路径:Utilities\bin\x64\DxTex.exe 二.修改分辨率 Format-Resize Texture 三.修改mipmap Format-Change Surface Format

专业的保密网文件导入导出系统,让文件流转行为更可控安全

军工单位因其涉及国防安全和军事机密,对保密工作有极高的要求,通常会采取严格的网络隔离措施来保护敏感信息和提高网络安全性。常见的方式是通过物理隔离将网络彻底分隔开来,比如保密网和非保密网。网络隔离后,仍有数据交换的需求…

VALSE 2024年度进展评述内容分享-世界模型增强下的自动驾驶

2024年视觉与学习青年学者研讨会(VALSE 2024)于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道,方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

【kali换源之后签名无效,报错处理】

#一、问题:报错信息# 错误:1 http://mirrors.ustc.edu.cn/kali kali-rolling InRelease 错误:2 http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling InRelease 错误:3 http://dl.google.com/linux/chrome/deb stable InRelease 错误:4 http://mirrors.aliyu…

LeetCode509:斐波那契数(使用动态规划)

题目描述 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n > 1…

Web3 ETF软件系统的主要功能

下面是Web3 ETF系统软件的主要功能,这些功能共同构成了Web3 ETF系统软件的核心,使其能够有效地为投资者提供Web3技术相关的投资机会,同时确保合规性、安全性和透明度。北京木奇移动软件有限公司,专业的软件外包开发公司&#xff0…

Java性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器,是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型,这些集合类型使用不同的数据结构来实现。因此,不同的集合类型,使用场景也不同。 很多同学在面试的时候&#x…

3个电脑录制视频技巧,新手也能轻松上手

在当今信息化时代,电脑录制视频已经成为人们日常工作和学习中的一项重要技能。无论是录制在线会议、教程讲解还是游戏直播,一款合适的录屏软件都至关重要。本文将介绍三种常见的电脑录制视频方法,为广大用户提供详细的操作步骤,满…

Python中的分布式爬虫系统Scrapy与分布式任务队列的结合

随着互联网的不断发展,网络爬虫在数据采集和信息挖掘中发挥着重要作用。然而,单机爬虫往往难以应对大规模数据抓取的需求,因此,构建分布式爬虫系统成为了一种必然选择。本文将介绍如何利用 Python 中的 Scrapy 框架和分布式任务队…

VALSE 2024主旨报告内容解析:以深度学习框架为牵引促进自主AI生态发展

2024年视觉与学习青年学者研讨会(VALSE 2024)于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道,方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

AngusTester安装Mock服务

一、介绍 Mock服务(AngusMockService) 提供了一个虚拟环境,让您能够模拟不同的接口响应、状态码和数据,快速生成并模拟您所依赖的API,使开发和测试先行,以实现更快的开发和更全面的测试,更早地交付稳定的产品或应用。…

Amazon Bedrock 托管 Llama 3 8B70B

Amazon Bedrock 托管 Llama 3 8B&70B,先来体验:(*实验环境账号有效期为1天,到期自动关停,请注意重要数据保护) https://dev.amazoncloud.cn/experience/cloudlab?id65fd86c7ca2a0d291be26068&visi…

AI烟雾监测识别摄像机:智能化安全防范的新利器

随着现代社会的不断发展,人们对于安全问题的关注日益增加,尤其是在日常生活和工作中,对火灾等意外事件的预防成为了一项重要任务。为了更好地应对火灾风险,近年来,AI烟雾监测识别摄像机应运而生,成为智能化…

[笔试训练](十四)

目录 040:乒乓球框 041:组队竞赛 042:删除最大数字的相邻分数 040:乒乓球框 乒乓球筐__牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 哈希简单查询 #include <iostream> #include <string> using namespace std; int main() {string s1, s2;w…