当前位置: 首页 > news >正文

FastAPI系列(18):ORM查询操作

 
本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695

添加表数据

手动依次添加以下表数据:
clas
teacher
course,依赖teacher
student,依赖clas
student_course,多对多的表
 

main.py

import uvicorn
from fastapi import FastAPI
from tortoise.contrib.fastapi import register_tortoisefrom test_orm.api.student import student_api
from test_orm.settings import TORTOISE_ORMapp = FastAPI()app.include_router(student_api, prefix="/student", tags=["学生接口"])# register_tortoise是注册函数,fastapi一旦运行,register_tortoise已经执行,通过传递进去的app对象,监听服务启动和终止事件
register_tortoise(app=app,config=TORTOISE_ORM,
)if __name__ == '__main__':uvicorn.run('main:app', host='127.0.0.1', port=8001, reload=True, workers=1)

  

补充:

# 该方法会在fastapi启动时触发,内部通过传递进去的app对象,监听服务启动和终止事件
# 当检测到启动事件时,会初始化Tortoise对象,如果generate_schemas为True则还会进行数据库迁移
# 当检测到终止事件时,会关闭连接
register_tortoise(app,config=TORTOISE_ORM,# generate_schemas=True,  # 如果数据库为空,则自动生成对应表单,生产环境不要开# add_exception_handlers=True,  # 生产环境不要开,会泄露调试信息
)
 

查询所有:all

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
def getAllStudent():# 查询所有 all方法students = Student.all()  # Queryset: [Student(),Student(),Student()]print(students)  # <tortoise.queryset.QuerySet object at 0x0000025B92F0FD00>return {"msg": "查询所有学生"}

  

浏览器请求后:因为没有加await,所以结果是一个QuerySet,加了才是返回对象

image

 

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
def getAllStudent():# 查询所有all方法students = Student.all()  # Queryset: [Student(),Student(),Student()]print(students)  # <tortoise.queryset.QuerySet object at 0x0000025B92F0FD00>for student in students:print(student.name, student.sno)return {"msg": "查询所有学生"}

  

浏览器请求后报错:tortoise.exceptions.ParamsError: QuerySet indices must be slices

image

 

 

tortoise是支持异步操作数据库的orm,必须异步,协程并发(支持大并发,请求来了放到一个请求队列),加async

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
async def getAllStudent():# 查询所有all方法students = await Student.all()  # Queryset: [Student(),Student(),Student()]print(students)for student in students:print(student.name, student.sno)return {"msg": "查询所有学生"}

  

浏览器请求后

image

 

可以循环,也可以索引访问

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
async def getAllStudent():# (1) 查询所有 all方法students = await Student.all()  # Queryset: [Student(),Student(),Student()]print(students, type(students))for student in students:print(student.name, student.sno)print(students[0])print(students[1])print(students[0].name)return {"msg": "查询所有学生"}

  

浏览器请求后

image

 

过滤查询:filter

返回模型类型对象list

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
async def getAllStudent():students = await Student.filter(name="ren")print(students, type(students))print(students[0].name)students = await Student.filter(clas_id=2)print(students)print(students[0].name)return {"msg": "ok"}

  

浏览器请求后

image

 

过滤查询:get

返回模型类型对象

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
async def getAllStudent():students = await Student.get(name="ren")print(students, type(students))print(students.name)students = await Student.get(clas_id=2)print(students)print(students.name)return {"msg": "ok"}

  

浏览器请求后

image

 

模糊查询

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
async def getAllStudent():students = await Student.filter(sno__gt=1001)  # __gt表示大于print(students, students[0], students[0].name)students = await Student.filter(sno__range=[1000, 9999])  # __range表示范围print(students, students[0], students[0].name)students = await Student.filter(sno__in=[1001, 2002])  # __in表示在哪些值中print(students, students[0], students[0].name)return {"msg": "ok"}

  

浏览器请求后

image

 

values查询

from fastapi import APIRouterfrom test_orm.models import Studentstudent_api = APIRouter()@student_api.get("/")
async def getAllStudent():students = await Student.filter(sno__range=[1, 10000])  # [Student(),Student(),Student(),...]print(students, students[0], students[0].name)students = await Student.all().values("name", "sno")  # [{},{},{},...]print(students, type(students))return {"结果": students}

 

浏览器请求后

image

 

接口文档请求

image

 

 

 如果是返回students
return students

 

说明json数组也是json

image

 

 

 

http://www.jsqmd.com/news/330530/

相关文章:

  • 在光学与电磁领域中的多元技术探索与实践
  • 电动汽车集群优化:Matlab 与 Yalmip 的奇妙结合
  • 2026降AI率指南:10款论文降ai工具红黑榜!亲测哪个免费降ai率工具不“智障”?
  • MATLAB程序实现排列熵算法:含详细注释版本
  • 使用 Rust 与 Tokio 构建高性能异步微服务:从零到生产部署实战指南
  • devtest-20260201 - devtest
  • 单相七电平级联逆变器开环仿真之旅(MATLAB/Simulink 实现)
  • Day26焦点事件
  • Go语言并发模式详解:从Goroutine到Channel最佳实践
  • 污水处理项目:西门子S7 - 300PLC与TP900触摸屏仿真T125实战
  • Redis深度优化:如何通过数据结构设计提升缓存命中率
  • 2026年1月靠谱OMO模式数字经济电商平台推荐排行榜,数字化电子商务,OMO模式数字经济电商平台排行榜单
  • 基于Java技术的大学生跑腿系统的设计与开发 开题报告
  • Matlab法诺共振拟合与Q因子计算:探索微观世界的奇妙工具
  • 探索PEMFC质子交换膜燃料电池模型:从密歇根大学模型到自主搭建
  • 部署安装 K8s 为什么要关闭 swap 分区?
  • AT_agc040_c Neither AB nor BA
  • AI原生应用领域推理能力的实时性优化
  • 新能源锂电池项目欧姆龙 NJ 程序实战分享
  • Go语言并发模式解析:channel与goroutine最佳实践
  • Clawdbot安装教程:从零开始到接入飞书
  • 基于MATLAB与CNN的语音信号分类探索
  • 老年人能力评估系统开发Day8
  • MATLAB代码:考虑电动汽车有序充放电的机组组合和最优潮流 关键词:电动汽车 MILP 最优...
  • GPUHammer:首个针对NVIDIA GPU的Rowhammer攻击专业的技术
  • 配电网故障重构:基于Matlab与Yalmip的二阶锥实现
  • 石蜡加热熔化:COMSOL 多物理场耦合仿真的奇妙之旅
  • 低压无感BLDC方波控制,全部源码,方便调试移植! 1.通用性极高,图片中的电机,一套参数即可...
  • There is an arbitrary file download vulnerability in novel-plus.
  • LeetCode算法学习之杨辉三角 - 详解