SQLModel 教程:使用 Python 3.10+ 实现数据库删除操作详解

SQLModel 教程:使用 Python 3.10+ 实现数据库删除操作详解

【免费下载链接】sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. 【免费下载链接】sqlmodel 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmodel

前言

SQLModel 是一个强大的 Python 库,它结合了 SQLAlchemy 和 Pydantic 的优点,为开发者提供了类型安全且直观的数据库操作方式。本文将重点讲解如何使用 SQLModel 进行数据库记录的删除操作,通过一个完整的英雄管理示例来演示整个流程。

环境准备

本教程基于 Python 3.10 及以上版本,使用了 SQLModel 的最新特性,包括联合类型(Union Types)的简洁语法。确保你的开发环境满足以下要求:

  • Python 3.10+
  • SQLModel 最新版本
  • SQLite 数据库(本示例使用)

数据模型定义

首先,我们需要定义一个 Hero 模型,它将映射到数据库中的表:

class Hero(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str = Field(index=True)
    secret_name: str
    age: int | None = 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)

这个方法会创建所有定义好的模型对应的数据库表。

数据准备

在演示删除操作前,我们需要先创建一些测试数据:

def create_heroes():
    hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
    # 其他英雄创建代码...
    
    with Session(engine) as session:
        session.add(hero_1)
        # 添加其他英雄...
        session.commit()

更新数据示例

删除操作前,我们先演示如何更新数据,因为在实际应用中,删除前可能需要先查询确认:

def update_heroes():
    with Session(engine) as session:
        # 查询要更新的记录
        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)

核心删除操作

现在来到本文的重点 - 删除数据库记录:

def delete_heroes():
    with Session(engine) as session:
        # 1. 查询要删除的记录
        statement = select(Hero).where(Hero.name == "Spider-Youngster")
        results = session.exec(statement)
        hero = results.one()
        print("Hero: ", hero)

        # 2. 执行删除
        session.delete(hero)
        session.commit()

        print("Deleted hero:", hero)

        # 3. 验证删除结果
        statement = select(Hero).where(Hero.name == "Spider-Youngster")
        results = session.exec(statement)
        hero = results.first()

        if hero is None:
            print("There's no hero named Spider-Youngster")

删除操作分为三个关键步骤:

  1. 查询记录:首先需要找到要删除的记录。我们使用 select() 查询和 where() 条件定位特定记录,results.one() 确保只返回一条记录。

  2. 执行删除:通过 session.delete(hero) 标记记录为待删除状态,然后 session.commit() 提交事务使删除生效。

  3. 验证结果:再次查询确认记录已被删除,results.first() 返回 None 表示记录不存在。

事务安全

SQLModel 的删除操作是事务性的:

  • commit() 之前,删除操作不会真正生效
  • 如果发生异常,事务会回滚,数据不会被破坏
  • 使用 with 语句确保会话正确关闭

错误处理建议

在实际应用中,应考虑以下错误情况:

  • 要删除的记录不存在(使用 one() 会抛出异常)
  • 并发修改问题(考虑使用乐观锁)
  • 外键约束导致的删除失败

完整流程示例

def main():
    create_db_and_tables()  # 初始化数据库
    create_heroes()         # 创建测试数据
    update_heroes()         # 更新数据演示
    delete_heroes()         # 删除数据演示

总结

通过本文,我们学习了如何使用 SQLModel 进行数据库删除操作,关键点包括:

  1. 先查询再删除的工作流程
  2. 事务性操作的重要性
  3. 删除后的验证方法
  4. 完整的 CRUD 操作示例

SQLModel 提供了简洁而强大的 API 来处理数据库操作,结合 Python 的类型提示,可以大大提高开发效率和代码质量。删除操作虽然简单,但在实际应用中需要考虑事务安全、错误处理等多方面因素。

【免费下载链接】sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. 【免费下载链接】sqlmodel 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmodel

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

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

抵扣说明:

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

余额充值