轻松驾驭数据库,SQLModel 让操作更简单


在这里插入图片描述

轻松驾驭数据库,SQLModel 让操作更简单

一、背景

在 Python 开发中,与数据库交互是常见的需求。传统的数据库操作方式往往较为繁琐,需要编写大量的 SQL 语句。而 SQLModel
库的出现,正是为了解决这一痛点。它结合了 SQLAlchemy 的强大功能和 Pydantic
的数据验证能力,让我们能够以更简洁、直观的方式操作数据库。接下来,我们将深入了解 SQLModel 的魅力所在。

二、SQLModel 是什么?

SQLModel 是一个用于 Python 的库,它允许我们使用 Python 类来定义数据库表结构,并通过这些类与数据库进行交互。它基于
SQLAlchemy 构建,同时集成了 Pydantic 的数据验证功能,使得我们在操作数据库时能够享受到更好的开发体验和数据安全性。

三、安装方法

SQLModel 是一个三方库,可以通过以下命令行安装:

bash复制

pip install sqlmodel

四、库函数使用方法

1. create_engine

用于创建数据库引擎,连接到指定的数据库。

Python复制

from sqlmodel import create_engine

# 创建 SQLite 数据库引擎
engine = create_engine("sqlite:///database.db")

逐行说明:

  • 导入 create_engine 函数。

  • 使用 create_engine 函数创建 SQLite 数据库引擎,指定数据库文件为 database.db

2. SQLModel.metadata.create_all

用于创建所有定义的表。

Python复制

from sqlmodel import SQLModel

# 创建所有表
SQLModel.metadata.create_all(engine)

逐行说明:

  • 导入 SQLModel

  • 调用 SQLModel.metadata.create_all 方法,传入数据库引擎 engine,创建所有表。

3. Session

用于创建数据库会话。

Python复制

from sqlmodel import Session

# 创建会话
with Session(engine) as session:
    pass

逐行说明:

  • 导入 Session

  • 使用 Session 创建会话,传入数据库引擎 engine

4. select

用于生成查询语句。

Python复制

from sqlmodel import select

# 生成查询语句
statement = select(Hero)

逐行说明:

  • 导入 select

  • 使用 select 生成查询语句,查询 Hero 表。

5. session.exec

用于执行查询语句。

Python复制

results = session.exec(statement)

逐行说明:

  • 调用 session.exec 方法,传入查询语句 statement,执行查询。

五、场景使用

1. 创建表

Python复制

from typing import Optional
from sqlmodel import Field, SQLModel

class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = None

逐行说明:

  • 导入 OptionalField

  • 定义 Hero 类,继承自 SQLModel,并设置 table=True

  • 定义表字段,包括 idnamesecret_nameage

2. 添加数据

Python复制

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()

逐行说明:

  • 创建 Hero 实例。

  • 使用 Session 创建会话。

  • 调用 session.add 方法添加数据。

  • 调用 session.commit 提交数据。

3. 查询数据

Python复制

with Session(engine) as session:
    statement = select(Hero).where(Hero.name == "Spider-Boy")
    hero = session.exec(statement).first()
    print(hero)

逐行说明:

  • 创建会话。

  • 生成查询语句,查询 Hero 表中 name 为 “Spider-Boy” 的数据。

  • 调用 session.exec 执行查询。

  • 使用 first 方法获取第一条结果。

4. 更新数据

Python复制

with Session(engine) as session:
    statement = select(Hero).where(Hero.name == "Spider-Boy")
    hero = session.exec(statement).one()
    hero.age = 16
    session.add(hero)
    session.commit()

逐行说明:

  • 创建会话。

  • 生成查询语句,查询 Hero 表中 name 为 “Spider-Boy” 的数据。

  • 使用 one 方法获取唯一结果。

  • 更新 age 字段。

  • 提交更新。

5. 删除数据

Python复制

with Session(engine) as session:
    statement = select(Hero).where(Hero.name == "Spider-Boy")
    hero = session.exec(statement).one()
    session.delete(hero)
    session.commit()

逐行说明:

  • 创建会话。

  • 生成查询语句,查询 Hero 表中 name 为 “Spider-Boy” 的数据。

  • 使用 one 方法获取唯一结果。

  • 调用 session.delete 方法删除数据。

  • 提交删除。

六、常见 Bug 及解决方案

1. 数据库连接错误

错误信息

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file

解决方案 : 确保数据库文件路径正确,或者使用绝对路径。

2. 字段类型不匹配

错误信息

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: Hero.age

解决方案 : 检查字段类型是否与数据库定义一致,确保字段值不为空。

3. 会话未提交

错误信息

sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back

解决方案 : 确保在操作数据库后调用 session.commit 提交事务。

七、总结

SQLModel 是一个强大的库,它结合了 SQLAlchemy 和 Pydantic
的优点,让我们能够以更简洁的方式操作数据库。通过本文的介绍,我们了解了 SQLModel
的安装、基本使用方法、常见场景以及常见问题的解决方案。希望这篇文章能帮助你更好地使用 SQLModel,提升开发效率。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嘎啦AGI实验室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值