SQLModel 关联查询
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697from sqlmodel import Field, Session, SQLModel, create_engine, select, unionclass Team(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str = Field(index=True) headquarters: strclass Hero(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) ...
SQLModel 自引用数据模型(多对多)
上文讲了自引用数据模型的一对多场景,主要用于构建树形数据结构。自引用数据模型还有多对多的场景,比如文章引用,参考等等,这个时候需要引入一张中间表来完成。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465from typing import List, Optionalfrom sqlmodel import Field, Relationship, Session, SQLModel, create_engine, selectclass PaperSimilarLink(SQLModel, table=True): paper_id: Optional[int] = Field( default=None, foreign_key="paper.id", primary_key=True ) similar_id: Optional[int] ...
SQLModel 自引用数据模型
自引用表在数据库中是一种比较常见的数据结构,那么在SQLModel中怎么建立一个自引用的数据模型来对应这种数据表呢?主要原理还是参考一对多表结构的数据模型创建方式,在单一模型中建立一对多关系链。
注意:这里需要使用SQLAlchemy中的 remote_site 参数,参见 Relationships API
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061from typing import Optionalfrom sqlmodel import Field, Relationship, Session, SQLModel, create_engineclass Node(SQLModel, table=True): __tablename__ = "node" # 表名 id: Optional[int] = Field(default=None, primary_key ...
SQLModel 关联关系(关联加载方式)
4. lazy加载方式参数lazy是SQLAlchemy的一个参数,定义了多表关联的数据加载方式,关联关系的加载分为三类;延迟加载、急切加载和不加载。
延迟加载是指从查询返回对象,并不加载相关对象。而当第一次在特定对象上访问给定的集合或引用时,会发出附加的 SELECT 语句,以便加载所请求的集合。
预加载是指从查询返回对象,并且相关集合或标量引用已经预先加载。 在这种场景,ORM 可以通过JOIN 来同时加载相关行,或者通过在主语句之后发出附加 SELECT 语句来立即加载集合或标量引用来实现此目的。
不加载是指禁用给定关系的加载,要么该属性为空并且从未加载,要么在访问该属性时引发错误,以防止不需要的延迟加载。
lazy参数在SQLModel中的使用案例如下:
12345678910111213141516171819class User(SQLModel, table=True): user_id: Optional[int] = Field(default=None, primary_key=True) username: str role_id: Opti ...
SQLModel 关联关系(一对一关系)
3. 一对一关系1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071from typing import Optionalfrom sqlmodel import Field, Relationship, Session, SQLModel, create_engineclass Card(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) card_id: str = Field(index=True) card_user: str tel: str detail: Optional["CardDetail"] = Relationship( back_populates="card", ...
SQLModel 关联关系(多对多关系)
2. 多对多关系1234567891011121314151617181920class HeroTeamLink(SQLModel, table=True): team_id: int | None = Field(default=None, foreign_key="team.id", primary_key=True) hero_id: int | None = Field(default=None, foreign_key="hero.id", primary_key=True)class Team(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str = Field(index=True) headquarters: str heroes: list["Hero"] = Relationship(back_populates="teams", ...
SQLModel 关联关系(一对多关系)
1. 一对多关系12345678910111213141516class Team(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str = Field(index=True) headquarters: str heroes: list["Hero"] = Relationship(back_populates="team")class Hero(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str = Field(index=True) secret_name: str age: int | None = Field(default=None, index=True) team_id: int | None = Field(default=None, ...
SQLModel 使用技巧
1. 主键在数据库中,主键都是设置成非空的。不过在SQLModel中,主键需要设置成可空的,如:
1id: int | None = Field(default=None, primary_key=True)
这是因为这里的id 是由数据库自动生成的,而非在Python代码中。因此在创建一个实例的时候,一般都不会设置id,直到持久化到数据库中。因此,需要设置成可空字段,以免数据校验出错。
2. 连接数据库可以通过create_engine创建一个数据库连接:
1234sqlite_file_name = "database.db"sqlite_url = f"sqlite:///{sqlite_file_name}"engine = create_engine(sqlite_url, echo=True)
创建一个异步的数据库连接(需要安装aiosqlite包):
123456789from sqlalchemy.ext.asyncio import create_async_enginefrom sqlmodel.ext ...
SQLModel 入门
1. 简介SQLModel 建立在 SQLAlchemy 之上,提供了简化的连接管理和事务处理,同时直接支持 MySQL 数据类型和简化了外键和关系的定义,非常适合轻量级应用程序和小型项目。它可以使用 Pydantic 来定义模型,并且可以自动将这些模型映射到数据库表。这使得开发者可以轻松地进行数据库操作,而无需编写大量的 SQL 代码。
2. 安装首先,需要安装 FastAPI 和 SQLModel:
12pip install fastapi[all]pip install sqlmodel
3. 定义模型使用 SQLModel 定义模型非常简单。你只需要从 SQLModel 继承并添加字段即可。
123456from sqlmodel import SQLModel, Fieldclass User(SQLModel, table=True): id: int = Field(default=None, primary_key=True) name: str age: int
4. SQLModel的独特之处
基于Pydantic,继承了 Pydantic ...
pytest 单元测试覆盖率
pytest-cov 是一个用于测量 Python 代码测试覆盖率的 pytest 插件。它允许你在运行测试时自动收集覆盖率数据,并在测试完成后显示一个详细的报告。这对于确保你的代码库被充分测试非常有用。以下是如何使用 pytest-cov 的基本步骤:
安装首先,你需要确保已经安装了 pytest。如果尚未安装,可以通过 pip 安装它:
1pip install pytest
然后,安装 pytest-cov:
1pip install pytest-cov
使用安装后,你可以在命令行中使用 --cov 选项来运行 pytest 并收集覆盖率数据。
示例假设你的项目结构如下:
12345678your_project/ │ ├── your_module/ │ ├── __init__.py │ └── your_script.py │ └── tests/ └── test_your_script.py
在命令行中,你可以运行以下命令来收集 your_module 目录下的代码覆盖率数据:
1pytest --cov=your_module
...