SQLModel 教程:使用 Session 进行数据插入操作
前言
在数据库操作中,数据插入是最基础也是最重要的操作之一。本文将深入讲解如何在 SQLModel 框架中使用 Session 进行数据插入操作。SQLModel 是一个结合了 SQLAlchemy 和 Pydantic 优势的 Python ORM 框架,让数据库操作更加简洁高效。
准备工作
在开始插入数据前,我们需要确保已经完成了以下准备工作:
- 定义了 Hero 数据模型
- 创建了数据库引擎
- 建立了数据库表结构
以下是基础代码示例:
from typing import Optional
from sqlmodel import Field, SQLModel, create_engine
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
数据插入的基本概念
内存与数据库的数据关系
在编程语言中操作数据库时,我们需要理解两个数据存储位置:
- 内存中的数据:程序运行时创建的变量和对象
- 数据库中的数据:持久化存储在数据库中的数据
SQLModel 通过 Session 机制优雅地处理这两者之间的交互,使得操作更加符合 Python 的编程习惯。
创建数据实例
首先,我们需要在内存中创建数据实例:
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
每个 Hero 实例对应数据库表中的一行记录。
使用 Session 进行数据操作
创建 Session
Session 是 SQLModel 中管理数据库操作的核心对象。与全局唯一的 Engine 不同,Session 是短生命周期的,通常每个业务操作都会创建一个新的 Session。
from sqlmodel import Session
def create_heroes():
# 创建数据实例...
with Session(engine) as session:
# 数据库操作将在这里进行
pass
使用 with
语句可以确保 Session 在使用后正确关闭,释放资源。
添加数据到 Session
将创建的数据实例添加到 Session 中:
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
with Session(engine) as session:
session.add(hero_1)
session.add(hero_2)
session.add(hero_3)
session.commit()
提交事务
session.commit()
会将 Session 中所有待处理的操作一次性提交到数据库,这确保了操作的原子性 - 要么全部成功,要么全部失败。
完整示例代码
以下是完整的插入数据示例代码:
from typing import Optional
from sqlmodel import Field, Session, SQLModel, create_engine
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
with Session(engine) as session:
session.add(hero_1)
session.add(hero_2)
session.add(hero_3)
session.commit()
def main():
create_db_and_tables()
create_heroes()
if __name__ == "__main__":
main()
执行过程分析
当运行上述代码时,SQLModel 会输出执行的 SQL 语句:
- 检查表结构
- 开始事务
- 执行 INSERT 语句插入每条记录
- 提交事务
这个过程类似于 Git 的工作流程:
session.add()
类似于git add
,将更改暂存session.commit()
类似于git commit
,提交所有更改
最佳实践
- 使用 with 语句管理 Session:确保 Session 正确关闭
- 批量操作:尽量在一次 Session 中完成多个操作
- 事务管理:利用 commit/rollback 保证数据一致性
- 错误处理:在实际应用中添加适当的异常处理
总结
通过本文,我们学习了如何在 SQLModel 中使用 Session 进行数据插入操作。关键点包括:
- 创建数据模型实例
- 使用 Session 管理数据库操作
- 通过 add 方法添加数据
- 使用 commit 提交事务
掌握这些基础知识后,你就可以开始在应用中使用 SQLModel 进行数据持久化操作了。在下一篇文章中,我们将探讨主键和自增 ID 的相关知识。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考