SQLModel 教程:使用 Python ORM 更新数据库记录

SQLModel 教程:使用 Python ORM 更新数据库记录

sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. sqlmodel 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmodel

理解 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() 函数演示了完整的创建和更新流程:

  1. 首先创建两个团队记录
  2. 然后创建三个英雄记录
  3. 最后更新 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)

关键点解析

  1. 会话管理:使用 with 语句管理会话,确保资源正确释放
  2. 添加记录:使用 session.add() 添加新记录
  3. 提交更改session.commit() 将更改持久化到数据库
  4. 刷新对象session.refresh() 从数据库重新加载对象状态
  5. 更新记录:直接修改对象属性,然后调用 session.add()session.commit()

最佳实践

  1. 总是使用会话上下文管理器 (with 语句)
  2. 修改对象后记得调用 session.add()session.commit()
  3. 需要获取最新数据时使用 session.refresh()
  4. 对于复杂事务,考虑使用 session.begin() 进行显式事务管理

通过这个示例,我们可以看到 SQLModel 提供了简洁直观的 API 来进行数据库操作,特别是更新记录的操作与普通 Python 对象操作几乎无异,大大简化了数据库编程。

sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. sqlmodel 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmodel

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颜德崇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值