SQLModel笔记
SQLModel学习笔记
00 环境配置
- 创建虚拟环境:
python3.xx -m venv .venv
(使用-m
表示使用启动模块,.venv
表示创建的虚拟环境的文件夹名字) - 下载sqlmodel包:
pip install sqlmodel
,验证是否下载成功:pip list
- 所有的示例数据库都使用sqlite,使用
sqlite3 --version
检查是否安装sqlite
首次创建虚拟环境后,先使用
pip install --upgrade pip
更新pip版本
01 创建/连接 数据库
为了使用SQLModel在python中操作数据库,首先我们需要创建/连接 数据库
from sqlmodel import create_engine
db_file_name = "test.db"
db_url = f"sqlite:///{db_file_name}"
engine = create_engine(db_url)
行1: 导入了create_engine
方法,后续使用它创建一个engine对象,可以把这个对象看作一个隧道,我们通过这个隧道建立数据库与python的连接
行3: 定义了一个数据库文件名字
行4: 定义了一个数据库的url,通过该url,我们可以找到想要连接的数据库
每一种类型数据库的url格式不一定一样,这里是以sqlite为案例,其他的可以去google一下
行6: 使用数据库的url,创建引擎,建立数据库与python之间的联系
注意:若数据库不存在,则会在对应的地址创建一个数据库,然后再建立连接
02 建表
ORM(Object-Relational Mapping)是一种编程技术,也是一种设计美学,强调将类对象映射为数据库中的表,对象的字段映射为表的字段/列。我们可以直接通过函数,对数据库进行操作。请记住:在计算机世界里,处处都体现着这样的映射与抽象的思想
from sqlmodel import SQLModel, Field
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
secret_name: str
age: int | None = None
if __name__ == "__main__":
SQLModel.metadata.create_all(engine)
行1: 引入了SQLModel类与Field函数。通过继承SQLModel我们可以获得很多好处
- 借助pydantic的数据校验功能
- 在SQLModel.metadata中注册表(还需要设置
table=True
),从而建立了表与类的映射
行3: 定义了一个Hero类,继承自SQLModel,通过设置table=True
,来注册表。若没有该设置,则Hero类仅能够使用pydantic的校验功能
行4-7: 设置表的结构。所有设置了None的字段意味着该字段可以取NULL,话句话说,在数据库中该字段可以为空。(Field并不是赋值操作,他是一个标记,是对元数据的操作,用于标识字段的一些属性。更加详细的可以google:python Annotated)
通过主键设置为None,告诉sqlmodel,这个主键是一个自增的值。
试想若id默认不为None,意味着每次插入数据时,我们都必须显示的指明id的具体值,这与我们想要它自增的逻辑是违背的
行9: 函数入口
行10: 还记得engine的用处吗,用于连接数据库和python!我们通过SQLModel.metadata中注册的表信息(见行3的解析)和engine这个隧道,在数据库中创建表
请记住一点:表是通过名字进行映射的。
就算python中定义的类(以Hero为例),这个类的字段比数据库中Hero表的字段少,只要操作符合数据库的要求,那么就能在两者之间建立联系。
举个小例子,Hero类只有name字段,而数据库中的Hero表除了name字段还有age字段,二者也能通过SQLModel建立联系。
03 添加数据
在SQLModel中,我们使用engine管理与数据库的连接,使用Session对数据库进行交互。为每一个操作(查询、插入、删除…)我们都会单独开启一个Session,这样符合了单一责任的设计美学。
from SQLMoel import Session
with Session(engine) as session:
h1 = Hero(name="superman", secret_name="lalala")
h2 = Hero(name="spiderman", secret_name="hahaah")
session.add(h1)
session.add(h2)
session.commit()
行1: 从SQLModel中导入了Session
行3: 使用上下文管理器(with)创建了一个Session实例,自动调用session.close()
行4,5: 创建要插入表中的数据
行7,8: 使用add方法添加数据
行10: 提交事务
使用
add
并没有执行数据库的添加操作,而是暂时将目标进行缓存。有两点好处:集中式提交任务,提高效率;可以回滚数据,减少风险。
最后使用
commit
提交事务后,数据库发生改变,不可回滚