fastapi tortoise-orm 使用一

1.Tortoise ORM 在项目中的配置

1.模型定义

from tortoise import fields
from tortoise.models import Model


class DateTimeModel(Model):
    created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
    updated_at = fields.DatetimeField(auto_now=True, null=True, description="更新时间")

    class Meta:
        abstract = True
        
class GroupModel(DateTimeModel):
    uuid = fields.UUIDField(source_field="uuid", pk=True, unique=True, description="用户组唯一标识")
    name = fields.CharField(source_field="username", max_length=64, description="用户组名称")
    parent_uuid = fields.CharField(source_field="parent_uuid", max_length=32, null=True)
    users: fields.ReverseRelation["UserModel"]

    class Meta:
        table = "group"


class UserModel(DateTimeModel):
    uuid = fields.UUIDField(source_field="uuid", pk=True, unique=True, description="用户唯一标识")
    name = fields.CharField(source_field="username", max_length=64, description="用户展示名称,可以修改")
    password = fields.CharField(source_field="password", max_length=128, description="用户密码")
    status = fields.CharEnumField(UserStatus, default=UserStatus.OFFLINE, description="用户登录状态")
    # 一对多,关联管系,和Django没什大的区别
    group_uuid: fields.ForeignKeyRelation["GroupModel"] = \
        fields.ForeignKeyField("models.GroupModel", related_name="group", on_delete=fields.CASCADE)

    class Meta:
        table = "user"
        ordering = ["created_at"]

    class PydanticMeta:
        # 该字段不做展示,过滤作用
        exclude = ["password"]
        

2.数据库配置

  • 通过配置router实现读写分离

  • 如果数据库密码有特殊字符,需要先进性编码

3.fastapi中引入

4.通过aerich这个模块实现数据库的迁移,类似于django的makemigrationsmigrate功能

  1. 初始化配置,只需要使用一次

  • 初始化完会在当前目录生成一个文件pyproject.toml和一个空文件夹migrations

    • pyproject.toml:保存配置文件路径,低版本可能是aerich.ini

    • migrations:存放迁移文件

  1. 初始化数据库,一般情况下只用一次

  • 如果TORTOISE_ORM配置文件中的models改了名,则执行这条命令时需要增加--app参数,来指定你修改的名字

  • 生成migrstions/models文件夹

  • 生成migrstions/models/0_xxxx_init.py文件夹

  1. 更新模型并进行迁移

  • 迁移文件名的格式为 {version_num}{datetime}{name|update}.json。

  • 1_202029051520102929_drop_column.json

  • 如果aerich猜到您正在重命名列,它会要求重命名{old_column}为{new_column} [True],您可以选择True重命名列而不删除列,或者选择False删除列然后创建,如果使用MySQL,只有MySQL8.0+支持重命名。到语法

  1. 升级到最新版本

  1. 降级到指定版本

  • -v:指定版本

  • -d:降级的同时删除迁移文件

  • --yes:确认删除,不再交互式输入

  1. 显示当前可以迁移的版本

  1. 显示迁移历史

5.main.py主程序中进行注册

6.创建测试模型

2.Tortoise ORM 增删改查

1.查询

  • 1.使用 await 和 不使用 await 的区别

    • 1.使用 await 查询时,得到的结果是Model对象,可以直接获取其属性

  • 2.判断对象是否存在

  • 3.获取单条数据

  • 3.获取多条数据

  • 4.获取所有数据

  • 5.获取第一条数据

  • 6.仅获取模型中部分的字段

  • 7.select_relatedprefetch_related,常用于关联模型查询中,减少数据库访问频次,提高查询性能,此处不多做演示,具体可以查看django orm中的示例https://blog.csdn.net/qq_42517220/article/details/93381250

  • 8.不等于:exclude,比如查询name不等于111的用户

  • 9.数据去重

  • 10.统计条数

  • 11.聚合查询

  • 12.双下划线查询:根据字段值进行过滤

    关键字
    意义
    使用方法

    not

    不等于

    name__not='xxx'

    in

    范围内

    name__in=['xxx', 'xxx']

    not_in

    范围外

    name__not_in=['xxx', 'xxx']

    gte

    大于或等于

    age__gte=22

    gt

    大于

    age__gt=22

    lte

    小于等于

    age__lte=45

    lte

    小于

    age__lt=45

    range

    范围查询

    age__range=(18,45)

    isnull

    null查询

    desc__isnull=True

    not_isnull

    非null查询

    desc__not_isnull=True

    contains

    包含查询

    name__contains="test"

    icontains

    不区分大小写包含查询

    name__icontains="test"

    startswith

    开头查询

    name__startswith="test"

    istartswith

    不区分大小写开头查询

    name__istartswith="test"

    endswith

    结尾查询

    name__endswith="test"

    iendswith

    不区分大小写结尾查询

    name__iendswith="test"

    iexact

    不区分大小写的等于

    name__iexact="test"

    search

    全文检索(测试报错)

    name__search="test"

    year

    年份查询

    created_at__year=2020

    month

    月份查询

    created_at__month=7

    day

    日查询

    created_at__day=24

  • 13.JSON类型数据查询

  • 14.Q查询

  • 15.F表达式

2.创建

  • 1.单条数据创建

  • 2.批量创建

  • 3.查询或创建(如果查询得到,则返回该对象,否则直接创建)

3.更新

  • 1.根据条件更新

  • 2.更新还是创建

4.删除

  • 1.删除全部

  • 2.根据条件删除

Last updated