当前位置: 首页 > article >正文

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提交事务后,数据库发生改变,不可回滚


http://www.kler.cn/a/613808.html

相关文章:

  • 视图、MySQL、触发器、存储过程、流程控制语句
  • 免去繁琐的手动埋点,Gin 框架可观测性最佳实践
  • SpringBoot 面试八股文
  • 【Pytorch实战教程】with torch.no_grad():
  • 【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程
  • git push的时候出现无法访问的解决
  • Flink TaskManager之间数据传输(NetworkManager)
  • 服务器硬盘出现故障都有哪些解决方法?
  • Redis中的数据类型与适用场景
  • MATLAB 控制系统设计与仿真 - 31
  • NFC 碰一碰发视频的短视频剪辑功能源码技术开发
  • 编程技术水平横向和垂直发展的抉择全方位分析
  • 【HTML】验证与调试工具
  • 前端性能优化思路_场景题
  • chrome-driver安装
  • Hyperlane:Rust Web开发的未来,释放极致性能与简洁之美
  • 【Git “reset“ 命令详解】
  • 智慧科技,安全会见:辉视监狱智能会见系统助力监狱管理升级
  • 【Android】屏幕刷新机制(概览)
  • 通用人工智能(AGI)的发展路径(人工智能通识)