SQLModel 教程:使用 Python ORM 更新数据库记录
前言
SQLModel 是一个强大的 Python ORM(对象关系映射)工具,它结合了 SQLAlchemy 和 Pydantic 的优点,为开发者提供了简洁高效的数据库操作体验。本文将重点讲解如何使用 SQLModel 更新数据库中的现有记录。
环境准备
首先我们需要定义一个 Hero 数据模型:
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
这个模型定义了英雄的基本属性:
id
是主键,自动生成name
是英雄名称,建立了索引secret_name
是秘密身份age
是可选字段,也建立了索引
数据库初始化
我们使用 SQLite 作为数据库后端:
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
echo=True
参数会在控制台输出执行的 SQL 语句,便于调试。
创建初始数据
在 create_heroes()
函数中,我们创建了 7 个英雄实例并存入数据库:
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
# ...其他英雄实例
使用 session.add()
添加对象,session.commit()
提交事务。
更新记录的核心逻辑
update_heroes()
函数展示了如何查询并更新记录:
-
查询记录:
statement = select(Hero).where(Hero.name == "Spider-Boy") results = session.exec(statement) hero_1 = results.one()
-
修改记录属性:
hero_1.age = 16 hero_1.name = "Spider-Youngster"
-
标记对象为脏数据:
session.add(hero_1)
-
提交变更:
session.commit()
-
刷新对象状态(可选):
session.refresh(hero_1)
关键点解析
-
查询操作:使用
select()
构建查询,where()
添加条件,exec()
执行查询,one()
确保只返回一条记录。 -
更新操作:直接修改对象属性后,必须调用
session.add()
将对象标记为"脏"状态,这样 SQLModel 才知道需要更新。 -
事务提交:所有修改必须通过
commit()
才会真正写入数据库。 -
刷新操作:
refresh()
会从数据库重新加载对象状态,确保内存中的对象与数据库一致。
实际应用场景
这种更新模式适用于:
- 用户资料修改
- 商品信息更新
- 订单状态变更
- 任何需要修改现有记录的场合
最佳实践
- 尽量在同一个事务中完成相关更新
- 批量更新时考虑性能影响
- 重要操作添加异常处理
- 考虑使用版本控制字段处理并发更新
总结
通过 SQLModel 更新数据库记录非常简单直观:
- 查询获取要修改的对象
- 直接修改对象属性
- 调用
session.add()
标记修改 - 提交事务使更改生效
SQLModel 的这种设计让数据库操作更加 Pythonic,大大提高了开发效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考