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

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

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

原来的代码:

python 复制代码
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()

我们改写如下:

python 复制代码
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,第二个则提示已存在。

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

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

相关推荐
Arenaschi2 分钟前
在Tomcat中部署应用时,如何通过域名访问而不加端口号
运维·服务器
小张认为的测试3 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
钱多多_qdd8 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha10 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
Q_192849990620 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏22 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
良许Linux24 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
蜜獾云35 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维36 分钟前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
Hacker_Oldv41 分钟前
WPS 认证机制
运维·服务器·wps