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
...
pytest conftest 案例
一个FastAPI 项目 conftest.py 的案例,主要包含了配置文件定义、测试数据库的初始化、数据库session创建、HTTP客户端创建等fixture。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100@pytest_asyncio.fixture(scope="session", autouse=True)async def application(): """应用app.""" from app.main import app yield app@pytest_asyncio.fixture(scope="session", ...
pytest conftest
conftest.py 是 pytest 中的一个特殊文件,用于定义全局的配置、夹具(fixtures)、钩子函数和插件。下面将详细解析 conftest.py 文件的用法,包括使用方法、规则、建议和案例。
使用方法
创建 conftest.py 文件:在项目根目录或子目录下创建 conftest.py 文件。这个文件不需要显式导入,pytest 会自动识别并执行其中的配置。
定义夹具(fixtures):在 conftest.py 中,可以使用 @pytest.fixture 装饰器来定义全局夹具。这些夹具可以在多个测试模块中被共享和使用。
定义钩子函数:conftest.py 还可以定义全局的钩子函数,如 pytest_runtest_setup 和 pytest_runtest_teardown,这些函数分别在测试用例执行前后执行。
配置全局信息:在 conftest.py 中,可以定义一些全局的配置信息,如日志级别、报告输出路径等。
导入自定义插件:conftest.py 还可以用于导入自定义的 pytest 插件,以扩展 pytest 的功能。
规则
文件名称固定:conf ...
pytest fixture 使用
在自动化测试中,测试环境的准备与清理是确保测试稳定性和可重复性的关键步骤。pytest 框架通过其内置的 fixture 机制,为测试提供了灵活且强大的初始化与清理方案。本文将深入探讨 pytest fixture 的工作原理、使用场景、高级特性及其在实际测试中的应用。
一、Fixture 概述Fixture 是 pytest 中用于设置测试前置条件、执行测试后清理工作的功能。它可以是任何函数、类或者模块,通过特定的装饰器进行标记,以便 pytest 在测试执行过程中自动调用。Fixture 的设计哲学是“显式优于隐式”,它鼓励开发者在测试代码中明确指定测试依赖的资源和清理工作,从而提高代码的可读性和可维护性。
二、Fixture 的基本用法1. 定义 Fixture使用 @pytest.fixture 装饰器来定义一个 fixture。fixture 函数可以接收参数,并返回一个值,这个值会被测试函数作为参数接收。
123456789101112import pytest @pytest.fixture def database(): # 设置数据库连接 ...