SQLModel 教程:使用 Session 进行数据插入操作

SQLModel 教程:使用 Session 进行数据插入操作

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

前言

在数据库操作中,数据插入是最基础也是最重要的操作之一。本文将深入讲解如何在 SQLModel 框架中使用 Session 进行数据插入操作。SQLModel 是一个结合了 SQLAlchemy 和 Pydantic 优势的 Python ORM 框架,让数据库操作更加简洁高效。

准备工作

在开始插入数据前,我们需要确保已经完成了以下准备工作:

  1. 定义了 Hero 数据模型
  2. 创建了数据库引擎
  3. 建立了数据库表结构

以下是基础代码示例:

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)

数据插入的基本概念

内存与数据库的数据关系

在编程语言中操作数据库时,我们需要理解两个数据存储位置:

  1. 内存中的数据:程序运行时创建的变量和对象
  2. 数据库中的数据:持久化存储在数据库中的数据

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 语句:

  1. 检查表结构
  2. 开始事务
  3. 执行 INSERT 语句插入每条记录
  4. 提交事务

这个过程类似于 Git 的工作流程:

  • session.add() 类似于 git add,将更改暂存
  • session.commit() 类似于 git commit,提交所有更改

最佳实践

  1. 使用 with 语句管理 Session:确保 Session 正确关闭
  2. 批量操作:尽量在一次 Session 中完成多个操作
  3. 事务管理:利用 commit/rollback 保证数据一致性
  4. 错误处理:在实际应用中添加适当的异常处理

总结

通过本文,我们学习了如何在 SQLModel 中使用 Session 进行数据插入操作。关键点包括:

  1. 创建数据模型实例
  2. 使用 Session 管理数据库操作
  3. 通过 add 方法添加数据
  4. 使用 commit 提交事务

掌握这些基础知识后,你就可以开始在应用中使用 SQLModel 进行数据持久化操作了。在下一篇文章中,我们将探讨主键和自增 ID 的相关知识。

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、付费专栏及课程。

余额充值