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的makemigrations和migrate功能
aerich这个模块实现数据库的迁移,类似于django的makemigrations和migrate功能初始化配置,只需要使用一次
初始化完会在当前目录生成一个文件
pyproject.toml和一个空文件夹migrationspyproject.toml:保存配置文件路径,低版本可能是aerich.inimigrations:存放迁移文件
初始化数据库,一般情况下只用一次
如果
TORTOISE_ORM配置文件中的models改了名,则执行这条命令时需要增加--app参数,来指定你修改的名字生成migrstions/models文件夹
生成migrstions/models/0_xxxx_init.py文件夹
更新模型并进行迁移
迁移文件名的格式为 {version_num}{datetime}{name|update}.json。
1_202029051520102929_drop_column.json如果aerich猜到您正在重命名列,它会要求重命名{old_column}为{new_column} [True],您可以选择True重命名列而不删除列,或者选择False删除列然后创建,如果使用MySQL,只有MySQL8.0+支持重命名。到语法
升级到最新版本
降级到指定版本
-v:指定版本-d:降级的同时删除迁移文件--yes:确认删除,不再交互式输入
显示当前可以迁移的版本
显示迁移历史
5.main.py主程序中进行注册
6.创建测试模型
2.Tortoise ORM 增删改查
1.查询
1.使用
await和 不使用await的区别1.使用
await查询时,得到的结果是Model对象,可以直接获取其属性
2.判断对象是否存在
3.获取单条数据
3.获取多条数据
4.获取所有数据
5.获取第一条数据
6.仅获取模型中部分的字段
7.
select_related、prefetch_related,常用于关联模型查询中,减少数据库访问频次,提高查询性能,此处不多做演示,具体可以查看django orm中的示例https://blog.csdn.net/qq_42517220/article/details/933812508.不等于: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