SQLModel 教程:使用 Python ORM 更新数据库记录
前言
SQLModel 是一个强大的 Python ORM(对象关系映射)工具,它结合了 SQLAlchemy 和 Pydantic 的优点,为开发者提供了简洁高效的数据模型定义和数据库操作方式。本文将重点讲解如何使用 SQLModel 更新数据库中的记录。
数据模型定义
首先我们需要定义一个数据模型类 Hero
,它继承自 SQLModel
并设置了 table=True
参数,表示这个类对应数据库中的一个表:
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_db_and_tables()
函数会创建数据库和所有定义的表:
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
插入初始数据
create_heroes()
函数创建了多个英雄实例并插入数据库:
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
# ...其他英雄实例
使用会话(Session)批量添加并提交:
with Session(engine) as session:
session.add(hero_1)
# ...添加其他英雄
session.commit()
更新记录详解
核心的更新操作在 update_heroes()
函数中实现,我们一步步分析:
-
查询记录:使用
select()
查询名为 "Spider-Boy" 的英雄statement = select(Hero).where(Hero.name == "Spider-Boy")
-
执行查询:通过会话执行查询语句
results = session.exec(statement)
-
获取单个结果:使用
one()
方法确保只返回一条记录hero = results.one()
-
修改属性:直接修改对象的属性
hero.age = 16
-
标记为待更新:将修改后的对象添加到会话
session.add(hero)
-
提交更改:将更改持久化到数据库
session.commit()
-
刷新对象:从数据库重新加载对象的最新状态
session.refresh(hero)
最佳实践
- 事务管理:使用
with
语句管理会话,确保资源正确释放 - 错误处理:实际应用中应添加异常处理,特别是
one()
方法可能抛出异常 - 批量更新:对于大量更新,考虑使用批量操作提高性能
- 验证数据:可以在模型类中添加 Pydantic 验证器确保数据有效性
总结
通过这个示例,我们学习了 SQLModel 中更新数据库记录的标准流程:
- 查询要更新的记录
- 修改对象属性
- 添加到会话
- 提交更改
- 刷新对象状态
SQLModel 的这种设计既保持了 Python 的简洁性,又提供了强大的数据库操作能力,是 Python ORM 的一个优秀选择。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考