SQLModel 教程:使用 Python 3.10+ 实现数据库删除操作详解
前言
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")
删除操作分为三个关键步骤:
-
查询记录:首先需要找到要删除的记录。我们使用
select()查询和where()条件定位特定记录,results.one()确保只返回一条记录。 -
执行删除:通过
session.delete(hero)标记记录为待删除状态,然后session.commit()提交事务使删除生效。 -
验证结果:再次查询确认记录已被删除,
results.first()返回 None 表示记录不存在。
事务安全
SQLModel 的删除操作是事务性的:
- 在
commit()之前,删除操作不会真正生效 - 如果发生异常,事务会回滚,数据不会被破坏
- 使用
with语句确保会话正确关闭
错误处理建议
在实际应用中,应考虑以下错误情况:
- 要删除的记录不存在(使用
one()会抛出异常) - 并发修改问题(考虑使用乐观锁)
- 外键约束导致的删除失败
完整流程示例
def main():
create_db_and_tables() # 初始化数据库
create_heroes() # 创建测试数据
update_heroes() # 更新数据演示
delete_heroes() # 删除数据演示
总结
通过本文,我们学习了如何使用 SQLModel 进行数据库删除操作,关键点包括:
- 先查询再删除的工作流程
- 事务性操作的重要性
- 删除后的验证方法
- 完整的 CRUD 操作示例
SQLModel 提供了简洁而强大的 API 来处理数据库操作,结合 Python 的类型提示,可以大大提高开发效率和代码质量。删除操作虽然简单,但在实际应用中需要考虑事务安全、错误处理等多方面因素。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



