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)
总结
本篇文章我们主要讲解了如何封装更新和删除相关的方法。
如果你想要完整代码,或者一对一的学习指导,欢迎留言或者私信。