【Tortoise-ORM】 高级特性与实战

文章目录

  • [6. 迁移与数据库管理](#6. 迁移与数据库管理)
    • [使用 `Tortoise-ORM` 与 `aerich` 进行数据库迁移管理](#使用 Tortoise-ORMaerich 进行数据库迁移管理)
      • [安装 `aerich`](#安装 aerich)
      • [配置 `aerich`](#配置 aerich)
      • 创建和应用数据库迁移
        • [1. 创建迁移](#1. 创建迁移)
        • [2. 查看迁移历史](#2. 查看迁移历史)
        • [3. 应用迁移](#3. 应用迁移)
        • [4. 回滚迁移](#4. 回滚迁移)
      • 迁移常见问题
  • [7. 事务管理](#7. 事务管理)
    • [使用 `Tortoise` 提供的事务管理](#使用 Tortoise 提供的事务管理)
      • [1. 开始事务:](#1. 开始事务:)
      • [2. 提交事务:](#2. 提交事务:)
      • [3. 回滚事务:](#3. 回滚事务:)
      • [4. 手动控制提交和回滚](#4. 手动控制提交和回滚)
    • 事务管理的最佳实践
  • [8. 性能优化](#8. 性能优化)
  • [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-ORMaerich 进行数据库迁移管理

aerich 是一个轻量级的数据库迁移工具,它专门为 Tortoise-ORM 设计,支持自动化生成、应用和回滚数据库迁移。它能帮助在数据库和模型定义发生变化时,自动生成迁移脚本,并将这些脚本应用到数据库中。

安装 aerich

首先,需要安装 aerich 工具,它是一个单独的工具包,可以通过 pip 安装:

bash 复制代码
pip install aerich

配置 aerich

在项目中使用 aerich 时,需要进行一些基本配置。通常需要在项目根目录下创建一个配置文件,指定数据库连接信息及模型路径。aerich 依赖于 Tortoise 的配置,因此需要先配置好 Tortoise-ORM

  1. 创建配置文件:

    通常将数据库配置放在 config.py 中,并在 aerich 中引用。配置文件内容如下:

    python 复制代码
    # config.py
    TORTOISE_ORM = {
        "connections": {
            "default": "sqlite://db.sqlite3",  # 使用 SQLite 作为数据库
        },
        "apps": {
            "models": {
                "models": ["your_project.models"],  # 模型模块路径
                "default_connection": "default",
            },
        },
    }
  2. 初始化 aerich

    在项目根目录下初始化 aerich,以便生成数据库迁移配置文件:

    bash 复制代码
    aerich 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>

迁移常见问题

  1. 数据库表未更新:

    如果修改了模型但是数据库表没有更新,确保迁移文件已成功生成并应用。可以通过 aerich history 查看迁移记录,检查当前数据库版本是否与迁移文件匹配。

  2. 字段类型变化:

    如果修改了字段的类型,aerich 会根据情况生成相应的 SQL 语句进行更改。在某些情况下,数据库可能不支持某些字段类型的修改,这时可能需要手动干预。

  3. 数据库连接问题:

    如果在配置数据库连接时遇到问题,确保连接字符串正确,并且相关的数据库服务(如 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 被抛出,那么事务会自动回滚。也就是说,user1user2 的数据不会被保存到数据库中,数据库的状态会回到事务开始时的状态。

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 模型中的 usernameemail 字段被索引,以提高基于这两个字段的查询性能。

选择索引时的注意事项:

  • 字段选择 :为经常用于查询的字段(如 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_savepost_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 的 startupshutdown 事件用来初始化和关闭数据库连接。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_startafter_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_startafter_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. 实际项目概述

假设我们正在开发一个简单的任务管理应用,用户可以创建任务、查看任务列表、更新任务状态以及删除任务。我们的任务模型包括任务的标题、描述、状态(待办、进行中、已完成)和创建时间。

我们将通过以下步骤实现:

  1. 设计数据库模型。
  2. 使用 Tortoise-ORM 进行数据库操作。
  3. 在 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)

这里使用了 TaskInTaskOut 模型:

  • 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 的易用性和异步特性使其成为一个理想的选择,尤其适用于需要高并发数据库操作的应用。通过合理的数据库模型设计和优化查询操作,可以有效提升应用的性能和可维护性。

相关推荐
冒泡的肥皂2 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.3 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
IT利刃出鞘5 小时前
Java线程的6种状态和JVM状态打印
java·开发语言·jvm
薛晓刚6 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队6 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光6 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12016 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色6 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
颜颜yan_7 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4537 小时前
管理项目服务器连接数据库
数据库·后端