fastzdp_sqlmodel框架是如何实现更新和删除相关的功能封装的,20240817,Python的国产新ORM框架

news2024/11/24 12:55:57

根据模型对象更新

初步封装的方法

def update(engine, model_obj, update_dict):
    """
    修改数据
    :param engine: 连接数据库的引擎对象
    :param model_obj: 模型对象
    :param update_dict: 更新字典
    :return:
    """
    with Session(engine) as session:
        if not isinstance(update_dict, dict):
            return
        for k, v in update_dict.items():
            if hasattr(model_obj, k):
                setattr(model_obj, k, v)
        session.add(model_obj)
        session.commit()
        session.refresh(model_obj)
        return model_obj

测试代码

from typing import Optional
from sqlmodel import Field, SQLModel
import fastzdp_sqlmodel as fsqlmodel


class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    age: Optional[int] = None


# 创建数据库引擎
engine = fsqlmodel.get_engine(database="fastzdp_sqlmodel")

# 初始化表格
fsqlmodel.init_table(engine)

# 创建数据
u = User(name="张三", age=23)
fsqlmodel.add(engine, u)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

# 修改
update_dict = {"name": "张三333"}
fsqlmodel.update(engine, u, update_dict)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

根据ID修改

在真实的开发中,根据ID修改数据是非常常见的需求,所以我决定封装一个对应的便捷使用方法。

初步封装代码如下

def update_id(engine, model, id, update_dict):
    """
    修改数据
    :param engine: 连接数据库的引擎对象
    :param model: 模型类
    :param id: 要修改的ID
    :param update_dict: 更新字典
    :return:
    """
    # 查询
    model_obj = get(engine, model, id)
    if not model_obj:
        return

    # 修改
    return update(engine, model_obj, update_dict)

这里主要借助之前的get根据ID查询数据的方法以及update根据模型修改数据的方法。

测试

那么,我们还是来写一个简单的测试代码。

from typing import Optional
from sqlmodel import Field, SQLModel
import fastzdp_sqlmodel as fsqlmodel


class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    age: Optional[int] = None


# 创建数据库引擎
engine = fsqlmodel.get_engine(database="fastzdp_sqlmodel")

# 初始化表格
fsqlmodel.init_table(engine)

# 创建数据
u = User(name="张三", age=23)
fsqlmodel.add(engine, u)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

# 修改
update_dict = {"name": "张三333"}
fsqlmodel.update_id(engine, User, 1, update_dict)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

在这里插入图片描述

和update方法对比

比起update方法,这个方法能省略掉先查询出对象的步骤。

不过,update方法可以更新任何模型对象,但是这个方法只能更新根据ID查询出来的模型对象。

从本质上来说,这个方法的底层最终走的还是update方法。

封装删除方法

原本的代码

from typing import Optional
from sqlmodel import Field, SQLModel, create_engine, Session, select, or_


class User(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str = Field(index=True)
    age: int | None = Field(default=None, index=True)


# 创建数据库引擎
sqlite_url = "mysql+pymysql://root:root@127.0.0.1:3306/fastzdp_sqlmodel?charset=utf8mb4"
engine = create_engine(sqlite_url, echo=True)

# 创建所有表
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)

# 新增
u1 = User(name="张三1", age=23)
u2 = User(name="张三2", age=23)
u3 = User(name="张三3", age=23)

with Session(engine) as session:
    session.add(u1)
    session.add(u2)
    session.add(u3)
    session.commit()

# 查询
with Session(engine) as session:
    statement = select(User).where(User.name == "张三1")
    results = session.exec(statement)
    hero = results.one()
    print("User: ", hero)

    session.delete(hero)
    session.commit()
    print("Deleted hero:", hero)

    statement = select(User).where(User.name == "张三1")
    results = session.exec(statement)
    hero = results.first()
    if hero is None:
        print("不存在名字叫张三1的用户")

初步封装

阅读上面的代码可以发现,删除和更新类似,都需要先找到模型对象,然后在对模型对象做操作。

初步封装代码如下:

def delete(engine, model_obj):
    """
    根据模型删除数据
    :param engine: 连接数据库的引擎对象
    :param model_obj: 模型对象
    :return: None
    """
    with Session(engine) as session:
        session.delete(model_obj)
        session.commit()

简单的测试

from typing import Optional
from sqlmodel import Field, SQLModel
import fastzdp_sqlmodel as fsqlmodel


class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    age: Optional[int] = None


# 创建数据库引擎
engine = fsqlmodel.get_engine(database="fastzdp_sqlmodel")

# 初始化表格
fsqlmodel.init_table(engine)

# 创建数据
u = User(name="张三", age=23)
fsqlmodel.add(engine, u)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

# 删除
fsqlmodel.delete(engine, u)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

在这里插入图片描述

从测试结果来看也是基本符合预期的。

封装根据ID删除的方法

根据ID删除的需求在真实的开发中也非常的常见,所以我们也来做一个简单的封装。

初步封装

def delete_id(engine, model, id):
    """
    根据模型删除数据
    :param engine: 连接数据库的引擎对象
    :param model: 模型类
    :param id: 要删除的ID
    :return: None
    """
    # 查询
    model_obj = get(engine, model, id)
    if not model_obj:
        return
    # 删除
    delete(engine, model_obj)

测试代码

from typing import Optional
from sqlmodel import Field, SQLModel
import fastzdp_sqlmodel as fsqlmodel


class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    age: Optional[int] = None


# 创建数据库引擎
engine = fsqlmodel.get_engine(database="fastzdp_sqlmodel")

# 初始化表格
fsqlmodel.init_table(engine)

# 创建数据
u = User(name="张三", age=23)
fsqlmodel.add(engine, u)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

# 删除
fsqlmodel.delete_id(engine, User, 1)

# 查询id为1的数据
u = fsqlmodel.get(engine, User, 1)
print(u)

在这里插入图片描述

总结

本篇文章我们主要讲解了如何封装更新和删除相关的方法。

如果你想要完整代码,或者一对一的学习指导,欢迎留言或者私信。

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

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

相关文章

Git工具详细使用教程

Git工具详细使用教程 Git是一个分布式版本控制系统,它可以帮助你管理代码的历史记录。本教程将介绍如何使用Git工具进行基本的版本控制操作。 1. 安装Git 首先,你需要在你的计算机上安装Git。你可以从Git官方网站(https://git-scm.com/&am…

MySQL(三)——DCL

文章目录 DCL用户管理查询用户创建用户修改用户密码删除用户 权限控制查询权限授予权限撤销权限 DCL DCL(Data Control Language,数据控制语言)是SQL的一个子集,专门用于定义数据库、表、视图等的访问权限和安全级别。 它允许数据…

Openstack二层网络的构建和使用

Openstack二层网络的构建和使用 一、实验目的 (1)了解网络层级、子网、动态地址、网关代理等概念并进行应用。 (2)了解OpenStack项目以及相关组件。 (3)了解 Neutron 二层网络的构建和使用。 二、实验原…

如何确定vtk .h文件所在的库名字

问题 例如使用class vtkSTLReader,头文件包含#include <vtkSTLReader.h>,库使用哪个&#xff1f; 解决 1.在vs2019解决方案资源管理器中搜索vtkSTLReader.cxx&#xff0c;显示project为IOGeometry即为库名 2.在所在的CMakeLists.txt追加库名 3.在cmake重新Configure、G…

JWT中的Token

1.JWT是什么&#xff1f; jwt&#xff08;json web token的缩写&#xff09;是一个开放标准&#xff08;rfc7519&#xff09;&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于在各方之间以json对象安全地传输信息&#xff0c;此信息可以验证和信任&#xff0c;因…

如果大模型有信仰,那一定是“规模法则”

规模&#xff08;scale&#xff09;是除去时间、空间之外另一个重要的维度。规模缩放&#xff08;Scaling&#xff09;的过程中隐藏着世界非线性本质奥秘背后的共性——规模法则。结合伯努瓦曼德布洛特 Benoit Mandelbrot的《大自然的分形几何》、杰弗里韦斯特 Geoffery West 的…

面试官:Java虚拟机是什么,Java虚拟机的内存模型是什么样子的?

哈喽&#xff01;大家好&#xff0c;我是小奇&#xff0c;一个专给面试官添堵的撑序员 小奇打算以轻松幽默的对话方式来分享一些技术&#xff0c;如果你觉得通过小奇的文章学到了东西&#xff0c;那就给小奇一个赞吧 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一…

EmguCV学习笔记 VB.Net 2.S 特别示例

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

el-image 图片预览时 与 el-table (或avue-crud) 样式冲突 的解决

问题: 解决 <style scoped> ::v-deep(.el-table__cell) {position: static !important; } </style> 后效果

SD-WAN视频汇聚网关,帮助企业省去公网服务器费用与流量费用,低成本、高可靠建设视频汇聚与管控平台,助力视频企业级智能应用

在介绍方案之前&#xff0c;我们先算一笔账&#xff0c;传统的B端项目大多数的场景是&#xff1a; 1、多个分布在不同区域&#xff0c;不同网络的现场需要进行视频设备的统一汇聚管理&#xff1b; 2、多种不同类型厂家和型号的设备需要接入&#xff1b; 3、需要接入各种设备的实…

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…

Keepalived知识点整理

Keepalived知识点整理 高可用集群 keeaplived高可用集群集群类型系统可用性实现高可用VRRP:Virtual Router Redundancy ProtocolVRRP相关术语 keepalived简介keeplived架构配置文件组成部分配置文件主要部分的解释说明: 环境配置ka1ka2realserver1realserver2 实验1:实验2独立日…

jetson循环输入密码登录不进GUI桌面环境

大概安装了pip, opencv, nvidia-jetpack&#xff0c;添加了环境变量&#xff0c;重启后&#xff0c;Jetson orin nano 登录不进去GUI桌面系统&#xff0c;输入密码后&#xff0c;又出现登录界面要求输入密码&#xff0c;如此循环&#xff0c;没有其他报错。 注意到在启动界面有…

天地伟业入职智鼎测评题库:EQT情商测验、IQCAT思维能力自适应测验

天地伟业智鼎题库EQT情商测验 情商测验采用关键事件法提取和概括人们在社会生活中发生的情景了解作答者在面对典型的工作、生活情景时最可能采取的做法&#xff0c;考察作答者的情绪觉察、情绪调节、自我激励、同理心、社交技能这5种重要的情绪智力&#xff0c;在销售人员和管理…

与人打交道的七个绝招

与人打交道的七个绝招&#xff0c;学会了让你混得风生水起&#xff01; 一、跟强者打交道&#xff0c;别绕圈子。就事论事&#xff0c;直奔主题&#xff1b; 二、跟没钱的人打交道&#xff0c;就直接告诉他能挣多少钱&#xff1b; 三、跟小人打交道&#xff0c;越虚假越好&…

i.MX6裸机开发(2):LED灯——汇编实现

本章主要包括两部分&#xff0c;第一部分讲解i.MX6ULL的GPIO配置方法以及常用寄存器介绍&#xff0c; i.MX6ULL的GPIO配置方法与单片机稍有不同&#xff0c;我们将详细介绍这部分内容。 第二部分讲解具体的实现代码以及程序的编译下载。 学习重点&#xff1a; 掌握i.MX6ULL GP…

YOLOV8网络结构|搞懂Backbone-Conv

参数量计算: (输入通道*w)*(输出通道*w)*k^2+(输出通道*w)*2 w是模型缩放里面的width - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 输出通道c2=64,k=3,s=2 P1/2 特征图变小一半 先定义算子层 再搭一个forward前向传播 class Conv(nn.Module):"""Standard convo…

《Techporters架构搭建》-Day06 国际化

什么是国际化&#xff1f; 国际化&#xff0c;也叫i18n&#xff0c;为什么叫i18n呢&#xff1f; "i18n"是国际化&#xff08;internationalization&#xff09;的缩写&#xff0c;数字18代表了国际化这个单词中间的字母数量。类似这样的缩写还有k8s&#xff08;kube…

Ubuntu离线安装库并解决依赖关系

&#xff08;1&#xff09;起因 安装插件出现库未找到的错误 configure: error: curses library is required but not found.&#xff08;2&#xff09;解决方法 手动到Ubuntu的库发布网页下载 http://packages.ubuntu.com/ 选择系统对应架构的版本下载&#xff0c;然后上传…

AI语言大模型商业价值深度解析

点击蓝字 关注我 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;特别是深度学习算法的进步&#xff0c;AI语言大模型在自然语言处理领域的表现日益突出。国内外多种语言大模型如&#xff1a;OpenAi 的 ChatGpt&#xff0c;阿里通义千问&#xff0c;百度文心…