SQLModel 教程:使用 Python ORM 更新数据库记录
前言
SQLModel 是一个强大的 Python ORM(对象关系映射)工具,它结合了 SQLAlchemy 和 Pydantic 的优点,为开发者提供了类型安全和简洁的 API。本教程将重点介绍如何使用 SQLModel 更新数据库中的记录。
环境准备
首先我们需要定义一个数据模型,这里以超级英雄为例:
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 语句,方便调试。
创建数据库和表
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
这个方法会创建所有定义的表结构。
初始化数据
我们创建了7个英雄实例并存入数据库:
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
# ...其他英雄实例
hero_7 = Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93)
with Session(engine) as session:
session.add(hero_1)
# ...添加其他英雄
session.commit()
更新记录的核心部分
重点来了,我们来看如何更新数据库中的记录:
def update_heroes():
with Session(engine) as session:
# 1. 查询要更新的记录
statement = select(Hero).where(Hero.name == "Spider-Boy")
results = session.exec(statement)
hero = results.one()
print("Hero:", hero)
# 2. 修改对象属性
hero.age = 16
# 3. 将修改后的对象添加回会话
session.add(hero)
# 4. 提交事务
session.commit()
# 5. 刷新对象以获取最新状态
session.refresh(hero)
print("Updated hero:", hero)
更新记录的完整流程包括:
- 查询要更新的记录
- 修改对象的属性
- 将修改后的对象添加回会话
- 提交事务使更改生效
- 刷新对象以获取数据库中的最新状态
最佳实践
- 事务管理:使用
with
语句确保会话正确关闭 - 错误处理:实际应用中应添加异常处理
- 批量更新:对于大量记录,考虑批量操作以提高性能
- 验证数据:可以在模型类中添加 Pydantic 验证器
总结
通过这个教程,我们学习了使用 SQLModel 更新数据库记录的基本方法。SQLModel 提供了简洁直观的 API,使得数据库操作更加 Pythonic。记住更新记录的基本流程:查询→修改→添加→提交→刷新,这是 ORM 操作的核心模式。
在实际开发中,你可以根据业务需求扩展这个基础模式,添加更复杂的查询条件、数据验证和事务管理等功能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考