文章目录

轻松驾驭数据库,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
逐行说明:
-
导入
Optional
和Field
。 -
定义
Hero
类,继承自SQLModel
,并设置table=True
。 -
定义表字段,包括
id
、name
、secret_name
和age
。
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,提升开发效率。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!