文章目录
- [6. 迁移与数据库管理](#6. 迁移与数据库管理)
-
- [使用 `Tortoise-ORM` 与 `aerich` 进行数据库迁移管理](#使用
Tortoise-ORM
与aerich
进行数据库迁移管理) -
- [安装 `aerich`](#安装
aerich
) - [配置 `aerich`](#配置
aerich
) - 创建和应用数据库迁移
-
- [1. 创建迁移](#1. 创建迁移)
- [2. 查看迁移历史](#2. 查看迁移历史)
- [3. 应用迁移](#3. 应用迁移)
- [4. 回滚迁移](#4. 回滚迁移)
- 迁移常见问题
- [安装 `aerich`](#安装
- [使用 `Tortoise-ORM` 与 `aerich` 进行数据库迁移管理](#使用
- [7. 事务管理](#7. 事务管理)
-
- [使用 `Tortoise` 提供的事务管理](#使用
Tortoise
提供的事务管理) -
- [1. 开始事务:](#1. 开始事务:)
- [2. 提交事务:](#2. 提交事务:)
- [3. 回滚事务:](#3. 回滚事务:)
- [4. 手动控制提交和回滚](#4. 手动控制提交和回滚)
- 事务管理的最佳实践
- [使用 `Tortoise` 提供的事务管理](#使用
- [8. 性能优化](#8. 性能优化)
-
- [1. 通过索引优化查询性能](#1. 通过索引优化查询性能)
- [2. 批量插入优化](#2. 批量插入优化)
- [3. 使用缓存减少数据库访问](#3. 使用缓存减少数据库访问)
-
- [结合 Redis 缓存优化查询:](#结合 Redis 缓存优化查询:)
- 缓存使用的最佳实践:
- [4. 查询优化](#4. 查询优化)
- [9. 与其他框架的集成](#9. 与其他框架的集成)
-
- [1. 与 FastAPI 集成](#1. 与 FastAPI 集成)
-
- 安装依赖
- [配置 Tortoise-ORM 和 FastAPI](#配置 Tortoise-ORM 和 FastAPI)
- [在 FastAPI 路由中使用数据库操作](#在 FastAPI 路由中使用数据库操作)
- [2. 与 Sanic 集成](#2. 与 Sanic 集成)
-
- 安装依赖
- [配置 Tortoise-ORM 和 Sanic](#配置 Tortoise-ORM 和 Sanic)
- [在 Sanic 路由中使用数据库操作](#在 Sanic 路由中使用数据库操作)
- [3. 在 Web 框架中使用 Tortoise-ORM](#3. 在 Web 框架中使用 Tortoise-ORM)
- [10. 项目实战](#10. 项目实战)
-
- [1. 实际项目概述](#1. 实际项目概述)
- [2. 设计数据库模型](#2. 设计数据库模型)
- [3. **在 FastAPI 中集成数据库操作**](#3. 在 FastAPI 中集成数据库操作)
-
- 安装依赖
- [配置 FastAPI 和 Tortoise-ORM](#配置 FastAPI 和 Tortoise-ORM)
- [CRUD 操作](#CRUD 操作)
-
- [1. 创建任务](#1. 创建任务)
- [2. 获取任务列表](#2. 获取任务列表)
- [3. 获取单个任务](#3. 获取单个任务)
- [4. 更新任务状态](#4. 更新任务状态)
- [5. 删除任务](#5. 删除任务)
- [4. 测试和运行](#4. 测试和运行)
- [5. 总结](#5. 总结)
6. 迁移与数据库管理
在开发过程中,数据库模式的变更是不可避免的,例如添加字段、修改数据表结构或删除数据表等。为了在这些变更中保持数据的完整性和一致性,我们通常会使用数据库迁移工具来自动化这些操作。Tortoise-ORM 配合 aerich
工具实现了数据库迁移管理,下面将详细介绍如何使用它们进行迁移操作。
使用 Tortoise-ORM
与 aerich
进行数据库迁移管理
aerich
是一个轻量级的数据库迁移工具,它专门为 Tortoise-ORM 设计,支持自动化生成、应用和回滚数据库迁移。它能帮助在数据库和模型定义发生变化时,自动生成迁移脚本,并将这些脚本应用到数据库中。
安装 aerich
首先,需要安装 aerich
工具,它是一个单独的工具包,可以通过 pip
安装:
bash
pip install aerich
配置 aerich
在项目中使用 aerich
时,需要进行一些基本配置。通常需要在项目根目录下创建一个配置文件,指定数据库连接信息及模型路径。aerich
依赖于 Tortoise
的配置,因此需要先配置好 Tortoise-ORM
。
-
创建配置文件:
通常将数据库配置放在
config.py
中,并在aerich
中引用。配置文件内容如下:python# config.py TORTOISE_ORM = { "connections": { "default": "sqlite://db.sqlite3", # 使用 SQLite 作为数据库 }, "apps": { "models": { "models": ["your_project.models"], # 模型模块路径 "default_connection": "default", }, }, }
-
初始化
aerich
:在项目根目录下初始化
aerich
,以便生成数据库迁移配置文件:bashaerich init -t config.TORTOISE_ORM
这条命令会在项目目录下创建一个
migrations
文件夹,并且初始化相关配置。
创建和应用数据库迁移
一旦 aerich
配置完成,就可以开始创建和应用数据库迁移了。下面是常见的迁移操作。
1. 创建迁移
每当修改了模型(如新增、删除或修改字段),需要生成一个新的迁移文件。可以使用 aerich
提供的命令来创建迁移文件:
bash
aerich migrate --autogenerate
这条命令会扫描模型定义,自动生成迁移脚本,保存到 migrations
文件夹中。如果没有修改模型或模型没有变动,aerich
会提示没有需要迁移的内容。
2. 查看迁移历史
可以使用以下命令查看当前迁移的状态:
bash
aerich history
该命令会显示所有已经应用过的迁移版本。
3. 应用迁移
生成迁移文件后,接下来需要将迁移应用到数据库中。使用以下命令将迁移应用到数据库:
bash
aerich upgrade
该命令会将所有未应用的迁移脚本应用到数据库中,更新数据库结构。
4. 回滚迁移
如果需要回滚某个迁移,或者遇到数据库迁移失败的情况,可以使用 aerich
的回滚命令。假设想回滚到上一个迁移版本,可以使用以下命令:
bash
aerich downgrade
如果希望回滚到特定的迁移版本,可以指定迁移版本号:
bash
aerich downgrade <version>
迁移常见问题
-
数据库表未更新:
如果修改了模型但是数据库表没有更新,确保迁移文件已成功生成并应用。可以通过
aerich history
查看迁移记录,检查当前数据库版本是否与迁移文件匹配。 -
字段类型变化:
如果修改了字段的类型,
aerich
会根据情况生成相应的 SQL 语句进行更改。在某些情况下,数据库可能不支持某些字段类型的修改,这时可能需要手动干预。 -
数据库连接问题:
如果在配置数据库连接时遇到问题,确保连接字符串正确,并且相关的数据库服务(如 MySQL、PostgreSQL 等)已启动并可访问。
7. 事务管理
在数据库操作中,事务是为了保证数据的一致性和可靠性而提出的概念。一个事务是指一系列数据库操作,它们要么全部成功,要么全部失败。事务保证了即使在并发或系统崩溃的情况下,数据的完整性和一致性也能得到维护。
Tortoise-ORM 提供了对事务的支持,帮助我们在数据库操作中确保数据的一致性。通过事务管理,可以确保多个操作要么全部成功,要么在发生错误时回滚到事务开始时的状态。
使用 Tortoise
提供的事务管理
在 Tortoise-ORM 中,事务的管理通常使用 Tortoise.transaction()
方法来进行,这个方法会为自动处理事务的开始、提交和回滚。
1. 开始事务:
事务通常由 begin()
操作开始。在 Tortoise 中,Tortoise.transaction()
本身会在传入的代码块开始时自动开启一个事务,并在代码块执行结束时提交或回滚事务。
可以通过 Tortoise.transaction()
来显式地开始一个事务:
python
from tortoise import Tortoise
async def example_transaction():
async with Tortoise.transaction():
# 执行一系列数据库操作
pass
2. 提交事务:
事务提交通过 commit()
来完成,在 Tortoise 中,commit()
会自动在事务块完成时提交,不需要显式地调用。在代码块执行结束时,如果没有发生异常,事务会自动提交:
python
from tortoise import Tortoise
from myapp.models import User
async def create_user():
async with Tortoise.transaction():
# 事务开始
user = await User.create(username="new_user", email="newuser@example.com")
# 如果没有异常,事务会自动提交
在这个例子中,User.create()
操作会被包括在事务内。如果没有发生异常,事务会在代码块结束时提交,确保数据成功保存。
3. 回滚事务:
如果在事务过程中发生了异常,Tortoise 会自动执行回滚操作,确保数据库不会处于半成功状态。回滚操作通过 rollback()
完成,通常我们不需要显式地调用它,Tortoise 会在异常发生时自动回滚事务。
例如:
python
from tortoise import Tortoise
from myapp.models import User
async def create_user_with_error_handling():
try:
async with Tortoise.transaction():
# 事务开始
user1 = await User.create(username="user1", email="user1@example.com")
user2 = await User.create(username="user2", email="user2@example.com")
# 模拟错误
raise ValueError("Something went wrong!")
user3 = await User.create(username="user3", email="user3@example.com")
except Exception as e:
# 如果发生异常,事务会自动回滚
print(f"Error occurred: {e}")
在此例中,如果 ValueError
被抛出,那么事务会自动回滚。也就是说,user1
和 user2
的数据不会被保存到数据库中,数据库的状态会回到事务开始时的状态。
4. 手动控制提交和回滚
虽然在大多数情况下,Tortoise.transaction()
可以自动处理提交和回滚,但也可以通过手动控制事务的提交和回滚来精细管理事务。
python
from tortoise import Tortoise
async def manual_transaction():
async with Tortoise.transaction() as transaction:
try:
# 执行操作
pass
await transaction.commit() # 手动提交事务
except Exception as e:
await transaction.rollback() # 手动回滚事务
print(f"Error occurred: {e}")
在这个例子中,transaction.commit()
和 transaction.rollback()
手动控制事务的提交和回滚。
事务管理的最佳实践
-
尽量避免长时间持有事务:
如果事务在执行时被阻塞,它将会影响数据库的性能和其他事务的执行。长时间的事务也容易出现锁表的问题,因此要确保事务尽量精简、快速执行。
-
捕获并处理异常:
在使用事务时,要确保代码中出现的任何异常都能被捕获和正确处理,以便触发回滚操作,避免数据不一致。
-
使用事务来处理多个数据库操作:
如果操作涉及多个数据库表格或多个插入/更新操作,确保将它们放在同一个事务中执行,这样可以保证它们的原子性,要么全部成功,要么全部失败。
8. 性能优化
在开发数据库应用时,性能往往是一个至关重要的考虑因素。随着数据量的增长,如何优化查询效率、减少数据库访问次数以及提高整体响应速度变得尤为重要。Tortoise-ORM 提供了一些工具和方法,帮助开发者在不同场景下进行性能优化。
1. 通过索引优化查询性能
索引是数据库中一种常用的优化技术,能够显著提高查询操作的速度。通过为数据库表中的某些字段创建索引,数据库可以快速定位到相关的数据行,而无需扫描整个表。索引通常用于频繁作为查询条件的字段。
在 Tortoise-ORM 中,可以通过 Meta
类中的 indexes
参数为模型字段创建索引。例如:
python
from tortoise import models
from tortoise import fields
class User(models.Model):
username = fields.CharField(max_length=255, unique=True)
email = fields.CharField(max_length=255, unique=True)
age = fields.IntField()
class Meta:
indexes = [
('username',), # 创建复合索引
('email',), # 创建单字段索引
]
在这个例子中,User
模型中的 username
和 email
字段被索引,以提高基于这两个字段的查询性能。
选择索引时的注意事项:
- 字段选择 :为经常用于查询的字段(如
WHERE
子句中的条件字段)创建索引。避免为所有字段都创建索引,因为索引会增加数据插入和更新的成本。 - 复合索引 :当查询常常使用多个字段作为查询条件时,可以考虑创建复合索引。例如,如果查询经常是
WHERE username = ? AND age = ?
,那么可以创建一个复合索引(username, age)
。
2. 批量插入优化
对于需要插入大量数据的场景,逐条插入可能会导致性能瓶颈。Tortoise-ORM 提供了批量插入的功能,可以一次性插入多条记录,从而减少与数据库的交互次数,提高性能。
Tortoise-ORM 提供了 bulk_create()
方法来执行批量插入。例如:
python
from myapp.models import User
async def bulk_insert_users():
users = [
User(username="user1", email="user1@example.com", age=25),
User(username="user2", email="user2@example.com", age=30),
User(username="user3", email="user3@example.com", age=22),
]
await User.bulk_create(users)
在这个例子中,bulk_create()
方法将多个 User
实例一次性插入到数据库中,比逐条插入更加高效。
批量插入的最佳实践:
- 合理分批:对于大量数据的批量插入,可以根据数据库性能和操作系统的限制将数据分批插入。例如,将 1000 条数据分成 100 条一批进行插入,以防止因为一次性插入过多数据导致数据库压力过大。
- 关闭信号 :在批量插入时,可以关闭信号(如
pre_save
和post_save
信号)来提高性能,避免触发不必要的操作。
3. 使用缓存减少数据库访问
缓存是一种常见的性能优化手段,通过缓存常用数据,可以减少数据库的访问次数,提高应用程序的响应速度。在 Tortoise-ORM 中,虽然没有直接内置的缓存机制,但可以使用外部的缓存工具(如 Redis 或 Memcached)与 Tortoise-ORM 配合使用。
结合 Redis 缓存优化查询:
假设使用 Redis 作为缓存服务器,在查询数据时,首先检查缓存中是否存在数据,如果存在则从缓存中读取,如果不存在则从数据库中读取并将结果缓存起来。
python
import redis
from tortoise import Tortoise
from myapp.models import User
# 配置 Redis 客户端
cache = redis.StrictRedis(host='localhost', port=6379, db=0)
async def get_user_from_cache(user_id):
# 首先检查缓存
cached_user = cache.get(f"user:{user_id}")
if cached_user:
return cached_user # 返回缓存中的数据
# 如果缓存中没有数据,则查询数据库
user = await User.get(id=user_id)
# 将查询结果存入缓存,缓存 10 分钟
cache.setex(f"user:{user_id}", 600, user)
return user
在这个例子中,首先尝试从 Redis 缓存中获取用户数据,如果缓存中没有找到,才从数据库中查询并将结果存入缓存。这样可以有效减少数据库的查询负担。
缓存使用的最佳实践:
- 缓存过期时间:为缓存设置合理的过期时间,确保缓存中的数据不会过期太久,避免读取到过时的数据。
- 缓存击穿与雪崩:当多个请求同时访问相同的缓存数据时,可能会导致缓存击穿问题,解决方案是使用互斥锁或预加载数据。在高并发场景下,多个缓存过期同时发生可能会导致缓存雪崩,解决方法是为缓存的过期时间设置随机性,避免全部过期。
4. 查询优化
除了索引和缓存外,查询的优化也是提升性能的关键。通过合理的查询条件、避免查询不必要的字段、以及限制返回的结果数,都可以显著提高数据库查询的性能。
优化查询的技巧:
- 选择性查询 :避免使用
all()
返回所有记录,尽量使用filter()
限制查询条件。 - 限制返回字段 :通过
only()
或values()
方法选择只需要的字段,避免加载不必要的数据。 - 使用分页:当查询数据量较大时,使用分页查询而不是一次性加载所有数据。
python
# 只选择需要的字段
users = await User.all().only('username', 'email')
# 分页查询
page = 1
page_size = 10
users = await User.all().limit(page_size).offset((page - 1) * page_size)
通过这些查询优化技巧,可以减少查询的计算量和返回的数据量,从而提高查询的效率。
9. 与其他框架的集成
Tortoise-ORM 作为一个异步 ORM 框架,非常适合与异步 Web 框架如 FastAPI 或 Sanic 集成。在现代的 Web 开发中,异步框架能够提升应用的性能,特别是在处理高并发请求时。Tortoise-ORM 提供了与这些框架的无缝集成方式,使得开发者可以方便地在异步 Web 应用中使用 ORM 来处理数据库操作。
1. 与 FastAPI 集成
FastAPI 是一个快速、高效、现代的 Python Web 框架,特别适用于构建异步 Web 应用。Tortoise-ORM 可以与 FastAPI 很好地集成,使得数据库操作变得简单且高效。
安装依赖
首先,需要安装 Tortoise-ORM 和 FastAPI 以及 ASGI 服务器(如 uvicorn
):
bash
pip install fastapi uvicorn tortoise-orm
配置 Tortoise-ORM 和 FastAPI
接下来,在 FastAPI 应用中配置 Tortoise-ORM。首先需要初始化数据库连接,并在 FastAPI 启动时创建数据库表。
python
from fastapi import FastAPI
from tortoise import Tortoise
from tortoise.contrib.fastapi import register_tortoise
app = FastAPI()
# 数据库配置
DB_URL = 'sqlite://db.sqlite3'
@app.on_event("startup")
async def startup():
# 初始化数据库连接
await Tortoise.init(
db_url=DB_URL,
modules={"models": ["yourapp.models"]} # 配置模型
)
await Tortoise.generate_schemas() # 自动创建数据库表
@app.on_event("shutdown")
async def shutdown():
# 关闭数据库连接
await Tortoise.close_connections()
# 注册 Tortoise-ORM,使 FastAPI 可以与 Tortoise 配合使用
register_tortoise(app, db_url=DB_URL, modules={"models": ["yourapp.models"]}, generate_schemas=True)
在这个示例中,FastAPI 的 startup
和 shutdown
事件用来初始化和关闭数据库连接。register_tortoise
方法则简化了在 FastAPI 中注册 Tortoise-ORM 的步骤。
在 FastAPI 路由中使用数据库操作
可以在 FastAPI 的路由中直接使用 Tortoise-ORM 进行数据库操作。例如,获取用户列表的接口如下:
python
from fastapi import HTTPException
from yourapp.models import User
@app.get("/users")
async def get_users():
users = await User.all() # 使用 Tortoise ORM 查询数据库
return users
这个接口会查询数据库中的所有用户,并返回结果。
2. 与 Sanic 集成
Sanic 是另一个支持异步请求处理的 Python Web 框架,与 FastAPI 类似,Sanic 也可以与 Tortoise-ORM 很好地集成。以下是如何将 Tortoise-ORM 与 Sanic 集成的步骤。
安装依赖
首先,需要安装 Sanic 和 Tortoise-ORM:
bash
pip install sanic tortoise-orm
配置 Tortoise-ORM 和 Sanic
与 FastAPI 类似,在 Sanic 中使用 Tortoise-ORM 也需要在应用启动时进行初始化,通常使用 Sanic 的 before_server_start
和 after_server_stop
钩子来管理数据库连接。
python
from sanic import Sanic
from tortoise import Tortoise
from tortoise.contrib.sanic import register_tortoise
app = Sanic("myapp")
# 配置数据库连接
DB_URL = 'sqlite://db.sqlite3'
@app.before_server_start
async def startup(app, loop):
# 初始化 Tortoise-ORM 数据库连接
await Tortoise.init(
db_url=DB_URL,
modules={"models": ["yourapp.models"]} # 配置模型
)
await Tortoise.generate_schemas() # 自动创建数据库表
@app.after_server_stop
async def shutdown(app, loop):
# 关闭数据库连接
await Tortoise.close_connections()
# 注册 Tortoise-ORM
register_tortoise(app, db_url=DB_URL, modules={"models": ["yourapp.models"]}, generate_schemas=True)
@app.route("/users")
async def get_users(request):
users = await User.all() # 查询所有用户
return response.json([user.to_dict() for user in users])
在这个示例中,before_server_start
和 after_server_stop
分别用于初始化和关闭数据库连接。register_tortoise
方法注册了 Tortoise-ORM,使得 Sanic 能够与数据库进行交互。
在 Sanic 路由中使用数据库操作
可以像 FastAPI 中一样,在 Sanic 路由中使用 Tortoise-ORM 执行数据库操作:
python
@app.route("/users")
async def get_users(request):
users = await User.all() # 使用 Tortoise ORM 查询数据库
return response.json([user.to_dict() for user in users])
3. 在 Web 框架中使用 Tortoise-ORM
在任何异步 Web 框架中,使用 Tortoise-ORM 都非常直观。只需要在应用启动时初始化数据库连接,在关闭时清理资源。Tortoise-ORM 的异步支持使得它能够非常高效地处理大量并发请求,适用于需要高性能数据库操作的 Web 应用。
在使用 Tortoise-ORM 时,只需关注数据模型的定义和数据库操作,而不必关心底层的 SQL 查询。这使得开发者能够快速构建可维护且高效的数据库交互层,尤其是在高并发场景下,Tortoise-ORM 的异步特性能够大大提升性能。
10. 项目实战
在本部分中,我们将通过一个实际的项目示例,演示如何将 Tortoise-ORM 应用于实际开发中。通过设计和操作数据库模型,可以更好地理解如何在项目中高效地使用 Tortoise-ORM。
1. 实际项目概述
假设我们正在开发一个简单的任务管理应用,用户可以创建任务、查看任务列表、更新任务状态以及删除任务。我们的任务模型包括任务的标题、描述、状态(待办、进行中、已完成)和创建时间。
我们将通过以下步骤实现:
- 设计数据库模型。
- 使用 Tortoise-ORM 进行数据库操作。
- 在 FastAPI 中应用这些操作,处理前端请求。
2. 设计数据库模型
首先,定义一个 Task
模型来表示任务。我们将使用 Tortoise-ORM 来定义这个模型。
python
from tortoise import fields
from tortoise.models import Model
from datetime import datetime
class Task(Model):
id = fields.IntField(pk=True) # 主键
title = fields.CharField(max_length=255) # 任务标题
description = fields.TextField() # 任务描述
status = fields.CharField(max_length=50, default="To Do") # 任务状态
created_at = fields.DatetimeField(default=datetime.utcnow) # 创建时间
class Meta:
table = "tasks" # 指定数据库表名
在这个模型中,我们定义了:
id
:任务的唯一标识,使用整数类型作为主键。title
:任务的标题,使用CharField
。description
:任务的描述,使用TextField
。status
:任务的状态,使用CharField
,并且设置了默认值To Do
。created_at
:任务的创建时间,使用DatetimeField
,并设置默认值为当前时间。
3. 在 FastAPI 中集成数据库操作
接下来,在 FastAPI 中使用 Tortoise-ORM 进行任务的增、查、改、删操作。
安装依赖
首先,确保安装了所需的依赖:
bash
pip install fastapi tortoise-orm uvicorn
配置 FastAPI 和 Tortoise-ORM
在 FastAPI 中初始化 Tortoise-ORM,并配置数据库连接。
python
from fastapi import FastAPI, HTTPException
from tortoise import Tortoise
from tortoise.contrib.fastapi import register_tortoise
from tortoise.exceptions import DoesNotExist
from pydantic import BaseModel
app = FastAPI()
DB_URL = 'sqlite://db.sqlite3'
class TaskIn(BaseModel):
title: str
description: str
status: str
class TaskOut(BaseModel):
id: int
title: str
description: str
status: str
created_at: datetime
@app.on_event("startup")
async def startup():
await Tortoise.init(
db_url=DB_URL,
modules={"models": ["__main__"]}
)
await Tortoise.generate_schemas()
@app.on_event("shutdown")
async def shutdown():
await Tortoise.close_connections()
register_tortoise(app, db_url=DB_URL, modules={"models": ["__main__"]}, generate_schemas=True)
CRUD 操作
1. 创建任务
我们首先定义一个接口,用于创建新的任务:
python
@app.post("/tasks/", response_model=TaskOut)
async def create_task(task: TaskIn):
task_obj = await Task.create(**task.dict())
return await TaskOut.from_tortoise_orm(task_obj)
这里使用了 TaskIn
和 TaskOut
模型:
TaskIn
用于接收来自客户端的任务数据。TaskOut
用于响应客户端,返回任务的完整数据。
2. 获取任务列表
接下来,我们定义一个接口来获取任务列表:
python
@app.get("/tasks/", response_model=List[TaskOut])
async def get_tasks():
tasks = await Task.all()
return await TaskOut.from_queryset(tasks)
这个接口会查询所有任务并返回,使用 from_queryset
方法将查询结果转化为 Pydantic 模型。
3. 获取单个任务
通过任务的 id
获取任务的详细信息:
python
@app.get("/tasks/{task_id}", response_model=TaskOut)
async def get_task(task_id: int):
try:
task = await Task.get(id=task_id)
return await TaskOut.from_tortoise_orm(task)
except DoesNotExist:
raise HTTPException(status_code=404, detail="Task not found")
这个接口会根据任务的 id
查询任务,如果没有找到,则返回 404 错误。
4. 更新任务状态
定义一个接口来更新任务的状态:
python
@app.put("/tasks/{task_id}", response_model=TaskOut)
async def update_task(task_id: int, task: TaskIn):
try:
task_obj = await Task.get(id=task_id)
task_obj.title = task.title
task_obj.description = task.description
task_obj.status = task.status
await task_obj.save()
return await TaskOut.from_tortoise_orm(task_obj)
except DoesNotExist:
raise HTTPException(status_code=404, detail="Task not found")
该接口允许用户更新任务的标题、描述和状态。
5. 删除任务
删除任务的接口:
python
@app.delete("/tasks/{task_id}")
async def delete_task(task_id: int):
try:
task = await Task.get(id=task_id)
await task.delete()
return {"message": "Task deleted successfully"}
except DoesNotExist:
raise HTTPException(status_code=404, detail="Task not found")
该接口根据任务的 id
删除任务。
4. 测试和运行
当所有路由定义完成后,可以通过以下命令运行 FastAPI 应用:
bash
uvicorn main:app --reload
这样,FastAPI 服务将启动并监听请求,可以通过 http://localhost:8000
来访问这些 API 路由,测试增、查、改、删等数据库操作。
5. 总结
通过这个实战项目,我们学会了如何在实际应用中应用 Tortoise-ORM,设计数据库模型,并将这些操作与 FastAPI 集成。我们能够使用 Tortoise-ORM 提供的异步查询功能,快速处理数据库操作,构建高效的 Web 应用。
在实际项目中,Tortoise-ORM 的易用性和异步特性使其成为一个理想的选择,尤其适用于需要高并发数据库操作的应用。通过合理的数据库模型设计和优化查询操作,可以有效提升应用的性能和可维护性。