SQLModel笔记

SQLModel学习笔记

00 环境配置

  1. 创建虚拟环境: python3.xx -m venv .venv(使用-m表示使用启动模块,.venv表示创建的虚拟环境的文件夹名字)
  2. 下载sqlmodel包:pip install sqlmodel,验证是否下载成功:pip list
  3. 所有的示例数据库都使用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我们可以获得很多好处

  1. 借助pydantic的数据校验功能
  2. 在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提交事务后,数据库发生改变,不可回滚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沅筱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值