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