tortoise-orm 钩子函数
时间: 2023-06-23 15:58:17 浏览: 260
Tortoise-ORM 提供了多种钩子函数来帮助你在模型在创建/更新/删除时执行一些自定义的逻辑。以下是一些主要的钩子函数:
1. `pre_save`: 在保存模型之前执行的钩子函数。
2. `post_save`: 在保存模型之后执行的钩子函数。
3. `pre_create`: 在创建模型之前执行的钩子函数。
4. `post_create`: 在创建模型之后执行的钩子函数。
5. `pre_update`: 在更新模型之前执行的钩子函数。
6. `post_update`: 在更新模型之后执行的钩子函数。
7. `pre_delete`: 在删除模型之前执行的钩子函数。
8. `post_delete`: 在删除模型之后执行的钩子函数。
你可以通过重写这些钩子函数来实现你自己的逻辑。例如,你可以在 `pre_save` 钩子函数中验证模型的数据是否符合要求,或者在 `post_save` 钩子函数中执行一些与模型相关的操作。
相关问题
tortoise-orm aerich
### Tortoise-ORM 和 Aerich 的使用教程及常见问题解决方案
#### 1. 安装 Aerich 及其基本配置
为了安装并配置 Aerich 工具,需先通过 `pip` 命令完成安装:
```bash
pip install aerich
```
随后,在项目的根目录下初始化 Aerich 并指定 Tortoise ORM 的配置文件路径[^1]。
#### 2. 初始化数据库迁移环境
运行如下命令来初始化 Aerich 迁移环境:
```bash
aerich init --tortoise-config config.py
```
这里假设 `config.py` 是包含 Tortoise ORM 数据库连接设置的 Python 文件。此步骤会创建一个名为 `.aerich` 的子目录用于存储迁移记录和其他元数据[^4]。
#### 3. 创建初始迁移脚本
首次应用模型到数据库之前,应生成一个新的迁移文件:
```bash
aerich migrate
```
这一步骤将基于当前定义的数据模型自动生成必要的 SQL 脚本来构建相应的表格结构[^2]。
#### 4. 应用迁移至目标数据库
一旦准备好了新的迁移文件,则可以通过下面这条指令将其应用于实际的目标数据库中:
```bash
aerich upgrade
```
该命令负责执行所有未处理过的更改,使物理表单与应用程序中的逻辑表示保持同步。
#### 5. 处理 FastAPI 测试场景下的特殊需求
当涉及到 FastAPI 加上 Tortoise-ORM 组合时,由于两者都依赖于事件循环机制来进行异步操作,因此在编写单元测试时可能会遇到一些挑战。一种推荐的做法是在启动测试前手动触发框架内部的服务生命周期方法(即 startup/shutdown),从而确保每次都能在一个干净的状态下调用 API 接口[^5]。
例如可以这样实现:
```python
import asyncio
from fastapi import FastAPI
from tortoise.contrib.test import finalizer, initializer
app = FastAPI()
def setup_test_db():
"""Setup test database"""
initializer(["models"], db_url="sqlite://:memory:", app_label="tests")
async def teardown_test_db():
await finalizer()
@app.on_event("startup")
async def start_up():
loop = asyncio.get_running_loop()
loop.run_until_complete(setup_test_db())
@app.on_event("shutdown")
async def shut_down():
loop = asyncio.get_running_loop()
loop.run_until_complete(teardown_test_db())
```
上述代码片段展示了如何利用 Tortoise 提供的帮助函数来自定义 FastAPI 生命周期钩子,以便更好地适应测试环境中所需的条件。
tortoise-orm关联查询
在tortoise-orm中,可以使用`.prefetch_related()`方法进行关联查询,该方法可以在查询主要表的同时,预先加载相关表的数据,避免N+1查询问题。
例如,假设有两个表`Author`和`Book`,它们之间是一对多的关系(一个作者可以有多本书),可以使用如下代码进行关联查询:
```python
from tortoise.models import Model
from tortoise import fields
class Author(Model):
id = fields.IntField(pk=True)
name = fields.CharField(max_length=255)
class Book(Model):
id = fields.IntField(pk=True)
title = fields.CharField(max_length=255)
author = fields.ForeignKeyField('models.Author', related_name='books')
async def get_authors_with_books():
authors = await Author.all().prefetch_related('books')
for author in authors:
print(author.name)
for book in author.books:
print(f'\t{book.title}')
```
在上面的代码中,`prefetch_related('books')`方法将同时查询出所有的作者和他们的所有书籍,并将书籍列表存储在每个作者对象的`books`属性中,从而避免了N+1查询问题。
阅读全文