fastapi tortoise-orm 使用二

概述

fastapi是一个很优秀的框架,但是缺少一个合适的orm,官方代码里面使用的是sqlalchemy,异步也是使用的这个。但是我这边看到有tortoise-orm这个异步orm框架,不知道效率如何,这里先学习,之后做一个性能测试比较一下。 整个框架非常接近django,如果我没写的地方,要么是和django差不多,要么是没这功能。

fastapi引入

  • 在main.py文件里面引入如下代码:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from models import User_Pydantic, UserIn_Pydantic, Users
from tortoise.contrib.fastapi import HTTPNotFoundError, register_tortoise

app = FastAPI(title="Tortoise ORM FastAPI example")

...
register_tortoise(#这里是启动app的,之后会考虑和使用uvicorn启动的性能差别
    app,
    db_url="sqlite://:memory:",#数据库信息
    modules={"models": ["models"]},#models列表
    generate_schemas=True,#如果数据库为空,则自动生成对应表单,生产环境不要开
    add_exception_handlers=True,#生产环境不要开,会泄露调试信息
)
  • 引入tortoise-orm的方法:register_tortoise 解释

创建对应数据模型

tortoise-orm能使用的数据类型还挺丰富,满足了日常使用的需求。

创建Model

通过继承的方式创建Model

设置数据库字段field

  • 主要有如下字段(这些字段都没啥好说的,):

关系键讲解: ForeignKeyField

反向代码提示: 在使用外键的时候,我们需要获取到反向代码提示(即被绑定的model查询绑定model),这个时候需要使用relation字段来提示,(其实你不加也没啥关系,只是个提示作用,在django里面是编辑器和插件提前内置了相关字段所以不用手写) 示例代码如下:

字段介绍

  • 基本字段:

自定义字段

tortoise-orm支持自定义字段,这个功能挺好用的,这里先不讲了,一般用不到。。。请自行查看:link. 可以通过继承,然后重构相关字段控制字段在数据库的存储方式

Model模型方法

#常用查询方法我就不提了,讲一些不常用的

查询

参考django,略。

Q对象查询

这一块主要针对复杂查询。 有时,您需要执行比简单 AND 提供的更复杂的查询。幸运的是,我们有Q对象来调味的东西,并帮助您找到你需要的。然后,这些 Q 对象可用作参数。.filter().filter()

Q 对象用途极多,例如用例:

  • 创建 OR 筛选器

  • 嵌套筛选器

  • 倒置过滤器 例如,查找名称或 的事件:Event 1Event 2

字段过滤

在搜索的时候增加后缀可以实现字段的过滤效果: 比如:

相关参数如下:

  • not

  • in- 检查字段的值是否位于传递列表中

  • not_in

  • gte- 大于或等于传递的值

  • gt- 大于传递的值

  • lte- 低于或等于传递的值

  • lt- 低于传递值

  • range- 介于和给定两个值之间

  • isnull- 字段为空

  • not_isnull- 字段不为空

  • contains- 字段包含指定的子字符串

  • icontains- 不区分大小写contains

  • startswith- 如果字段以值开头

  • istartswith- 不区分大小写startswith

  • endswith- 如果字段以值结尾

  • iendswith- 不区分大小写endswith

  • iequals- 区分大小写等于

预取

通过预取,可以减少数据库读取次数,然后提高响应速度 有时只需要获取某些相关记录。您可以使用对象实现:Prefetch 示例:

F表达式

某些时候,我们只是需要将数据进行一次计算或处理然后保存,我们并不在意值是多少,只是想把值进行我们指定的修改,就可以使用F表达式,这样就可以减少一次数据库读取(我感觉好像没卵用啊。。。) 参考如下:

or use .save()

功能和聚合

略 请参考功能和聚合

事务

略 请参考事务

根据Model生成Schema

讲道理schema这个东西名字挺奇葩的。。。不过既然官网这么弄就这么弄吧。这个可以很方便的生成相关字段

注意,schema不要有相同的类名,会报错的

下面这个文档里面还没讲解; 可以通过在model里面创建一个class PydanticMeta来实现创建schema的控制:

如果你想跨表搜索或join搜索,在computed里面定义。

Last updated