当前位置: 首页 > news >正文

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

根据模型对象更新

初步封装的方法

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):returnfor 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 fsqlmodelclass User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)name: strage: 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 fsqlmodelclass User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)name: strage: 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 fsqlmodelclass User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)name: strage: 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 fsqlmodelclass User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)name: strage: 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)

在这里插入图片描述

总结

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 对外提供开放式数据查询使用什么数据存储?
  • 蚂蚁AL1 15.6T 创新科技的新典范
  • Python 算法交易实验81 QTV200日常推进-重新实验SMA/EMA/RSI
  • 记录|Label组件如何控制下边框为直线
  • 初识Linux系统,Ubuntu基础使用
  • 做题常用操作
  • PythonStudio 控件使用常用方式(二十七)TActionList
  • 探索Prompt调优的艺术:让AI更智能
  • 浅谈Sql Server 临时表
  • 执行docker compose命令出现 Additional property include is not allowed
  • 楼宇控制与智能家居实训室解决方案
  • linux系统编程:多任务编程(进程1)
  • 【Python快速入门和实践019】Python常用脚本-查看视频信息并压缩视频
  • C语言家教记录(六)
  • 【Qt】QWidget的toolTip属性
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Apache的基本使用
  • css属性的继承、初识值、计算值、当前值、应用值
  • docker-consul
  • iOS | NSProxy
  • JavaScript异步流程控制的前世今生
  • PermissionScope Swift4 兼容问题
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SQLServer之索引简介
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 爬虫模拟登陆 SegmentFault
  • 前端js -- this指向总结。
  • 移动端解决方案学习记录
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 最近的计划
  • kubernetes资源对象--ingress
  • #git 撤消对文件的更改
  • #java学习笔记(面向对象)----(未完结)
  • (C++20) consteval立即函数
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (ZT)薛涌:谈贫说富
  • (补充)IDEA项目结构
  • (定时器/计数器)中断系统(详解与使用)
  • (动态规划)5. 最长回文子串 java解决
  • (二十三)Flask之高频面试点
  • (附源码)计算机毕业设计大学生兼职系统
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)编辑寄语:因为爱心,所以美丽
  • ***监测系统的构建(chkrootkit )
  • . NET自动找可写目录
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET MVC第三章、三种传值方式
  • .NET 服务 ServiceController
  • .NET成年了,然后呢?
  • .ui文件相关
  • 。Net下Windows服务程序开发疑惑