SQLModel 教程:使用 Python ORM 更新数据库记录
理解 SQLModel 的数据更新机制
SQLModel 是一个强大的 Python ORM 工具,它结合了 SQLAlchemy 和 Pydantic 的优势,让数据库操作变得简单直观。本教程将重点讲解如何使用 SQLModel 更新数据库中的记录。
模型定义
首先,我们定义了两个数据模型:
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
headquarters: str
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)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
Team
模型表示团队,包含 id、名称和总部地址Hero
模型表示英雄,包含 id、名称、秘密身份、年龄和所属团队 id- 两个模型都设置了索引字段以提高查询效率
team_id
是外键,关联到Team
表的 id 字段
数据库连接设置
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
这里我们使用 SQLite 数据库,echo=True
会在控制台输出执行的 SQL 语句,方便调试。
创建数据库表
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
这个方法会创建所有定义好的模型对应的数据库表。
创建和更新记录
create_heroes()
函数演示了完整的创建和更新流程:
- 首先创建两个团队记录
- 然后创建三个英雄记录
- 最后更新 Spider-Boy 的团队归属
def create_heroes():
with Session(engine) as session:
# 创建团队记录
team_preventers = Team(name="Preventers", headquarters="Sharp Tower")
team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")
session.add(team_preventers)
session.add(team_z_force)
session.commit()
# 创建英雄记录
hero_deadpond = Hero(
name="Deadpond", secret_name="Dive Wilson", team_id=team_z_force.id
)
hero_rusty_man = Hero(
name="Rusty-Man",
secret_name="Tommy Sharp",
age=48,
team_id=team_preventers.id,
)
hero_spider_boy = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
session.add(hero_deadpond)
session.add(hero_rusty_man)
session.add(hero_spider_boy)
session.commit()
# 刷新对象以获取数据库生成的值
session.refresh(hero_deadpond)
session.refresh(hero_rusty_man)
session.refresh(hero_spider_boy)
# 打印创建结果
print("Created hero:", hero_deadpond)
print("Created hero:", hero_rusty_man)
print("Created hero:", hero_spider_boy)
# 更新Spider-Boy的团队
hero_spider_boy.team_id = team_preventers.id
session.add(hero_spider_boy)
session.commit()
session.refresh(hero_spider_boy)
print("Updated hero:", hero_spider_boy)
关键点解析
- 会话管理:使用
with
语句管理会话,确保资源正确释放 - 添加记录:使用
session.add()
添加新记录 - 提交更改:
session.commit()
将更改持久化到数据库 - 刷新对象:
session.refresh()
从数据库重新加载对象状态 - 更新记录:直接修改对象属性,然后调用
session.add()
和session.commit()
最佳实践
- 总是使用会话上下文管理器 (
with
语句) - 修改对象后记得调用
session.add()
和session.commit()
- 需要获取最新数据时使用
session.refresh()
- 对于复杂事务,考虑使用
session.begin()
进行显式事务管理
通过这个示例,我们可以看到 SQLModel 提供了简洁直观的 API 来进行数据库操作,特别是更新记录的操作与普通 Python 对象操作几乎无异,大大简化了数据库编程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考