论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
掌握Tortoise-ORM高级异步查询技巧
掌握Tortoise-ORM高级异步查询技巧
星球的眼睛
论坛元老
|
2025-4-22 12:21:22
|
显示全部楼层
|
阅读模式
楼主
主题
1419
|
帖子
1419
|
积分
4257
title: 掌握Tortoise-ORM高级异步查询技巧
date: 2025/04/22 12:05:33
updated: 2025/04/22 12:05:33
author:
cmdragon
excerpt:
Tortoise-ORM 提供了强大的异步查询功能,支持通过 Q 对象构建复杂查询条件,如逻辑运算符组合和动态条件构建。F 表达式用于字段级别的原子操作,避免竞争条件,实用于库存扣减和代价调整等场景。组合查询可通过注解和过滤实现复杂业务需求。常见错误包括字段不一致、未知字段和事务管理问题,需通过数据库迁移和异步上下文管理解决。
categories:
后端开发
FastAPI
tags:
Tortoise-ORM
异步查询
Q对象
F表达式
数据模型
复杂查询
错误处理
扫描
二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
探索数千个预构建的 AI 应用,开启你的下一个巨大创意
以下是根据要求撰写的技术博客内容:
利用Tortoise-ORM实现高级异步查询
1. 情况准备
pip install fastapi uvicorn tortoise-orm pydantic
复制代码
2. 数据模型定义
from tortoise.models import Model
from tortoise import fields
class Product(Model):
id = fields.IntField(pk=True)
name = fields.CharField(max_length=255)
price = fields.DecimalField(max_digits=10, decimal_places=2)
stock = fields.IntField(default=0)
is_active = fields.BooleanField(default=True)
class PydanticProduct(pydantic.BaseModel):
name: str
price: float
stock: int
class Config:
orm_mode = True
复制代码
3. Q对象深度解析
Q对象是构建复杂查询条件的利器,支持逻辑运算符组合查询条件
3.1 基础查询
# 查询价格大于100且库存充足的商品
products = await Product.filter(
Q(price__gt=100) & Q(stock__gte=10)
)
复制代码
3.2 复杂逻辑组合
from tortoise.expressions import Q
# 查询(价格低于50或库存为0)且未下架的商品
query = Q(
(Q(price__lt=50) | Q(stock=0)) &
Q(is_active=True)
)
results = await Product.filter(query)
复制代码
3.3 动态条件构建
def build_search_query(name: str = None, min_price: float = None):
query = Q()
if name:
query &= Q(name__icontains=name)
if min_price:
query &= Q(price__gte=min_price)
return query
复制代码
4. F表达式实战应用
F表达式用于字段级别的原子操作,避免竞争条件
4.1 库存扣减
from tortoise.expressions import F
# 安全扣除库存
await Product.filter(id=product_id).update(
stock=F('stock') - quantity
)
复制代码
4.2 代价调整
# 所有商品涨价10%
await Product.all().update(
price=F('price') * 1.1
)
复制代码
4.3 字段比力查询
# 查找库存大于订购量的商品
await Product.filter(stock__gt=F('min_order_quantity'))
复制代码
5. 组合查询示例
# 查询热门商品:评分>4且(价格<100或销量>1000)
hot_products = await Product.annotate(
total_sales=Sum('order_items__quantity')
).filter(
Q(rating__gt=4) &
(Q(price__lt=100) | Q(total_sales__gt=1000))
).order_by('-total_sales')
复制代码
6. 课后Quiz
问题1:以下查询有什么问题?
await Product.filter(Q(name=user_input) | Q(description=user_input))
复制代码
答案
:存在SQL注入风险,应当利用参数化查询。Tortoise-ORM会自动处理参数绑定,但必要确保user_input来自可信来源或颠末验证
问题2:如何原子性地实现"检察次数+1"?
答案
:利用F表达式:
await Product.filter(id=item_id).update(view_count=F('view_count') + 1)
复制代码
7. 常见错误处理
错误1:OperationalError: no such column
原因
:模型字段与数据库表结构不一致
解决
:
运行数据库迁移
aerich
upgrade
复制代码
查抄模型定义是否缺少字段
错误2:FieldError: Unknown field
原因
:查询利用了不存在的字段名
解决
:
查抄模型字段拼写
确认关联查询的related_name是否正确
错误3:TransactionManagementError
原因
:在事务外执行必要事务的操作
解决
:
async with in_transaction():
await Product.update(...)
复制代码
通过本文的代码示例和原理解说,读者可以掌握Tortoise-ORM的高级查询技巧。发起在开发过程中结合API文档利用这些功能,并注意异步上下文管理。
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完备的文章:
掌握Tortoise-ORM高级异步查询技巧 | cmdragon's Blog
往期文章归档:
<ul>
FastAPI与Tortoise-ORM实现关系型数据库关联 | cmdragon's Blog
Tortoise-ORM与FastAPI集成:异步模型定义与实践 | cmdragon's Blog
异步编程与Tortoise-ORM框架 | cmdragon's Blog
FastAPI数据库集成与事务管理 | cmdragon's Blog
FastAPI与SQLAlchemy数据库集成 | cmdragon's Blog
FastAPI与SQLAlchemy数据库集成与CRUD操作 | cmdragon's Blog
FastAPI与SQLAlchemy同步数据库集成 | cmdragon's Blog
SQLAlchemy 核心概念与同步引擎设置详解 | cmdragon's Blog
FastAPI依赖注入性能优化战略 | cmdragon's Blog
FastAPI安全认证中的依赖组合 | cmdragon's Blog
FastAPI依赖注入系统及调试技巧 | cmdragon's Blog
FastAPI依赖覆盖与测试情况模拟 | cmdragon's Blog
FastAPI中的依赖注入与数据库事务管理 | cmdragon's Blog
FastAPI依赖注入实践:工厂模式与实例复用的优化战略 | cmdragon's Blog
FastAPI依赖注入:链式调用与多级参数传递 | cmdragon's Blog
FastAPI依赖注入:从基础概念到应用 | cmdragon's Blog
FastAPI中实现动态条件必填字段的实践 | cmdragon's Blog
FastAPI中Pydantic异步分布式唯一性校验 | cmdragon's Blog
掌握FastAPI与Pydantic的跨字段验证技巧 | cmdragon's Blog
FastAPI中的Pydantic暗码验证机制与实现 | cmdragon's Blog
深入掌握FastAPI与OpenAPI规范的高级适配技巧 | cmdragon's Blog
Pydantic字段元数据指南:从基础到企业级文档增强 | cmdragon's Blog
Pydantic Schema天生指南:自定义JSON Schema | cmdragon's Blog
Pydantic递归模型深度校验36计:从无穷嵌套到亿级数据的优化法则 | cmdragon's Blog
Pydantic异步校验器深:构建高并发验证系统 | cmdragon's Blog
Pydantic根校验器:构建跨字段验证系统 | cmdragon's Blog
Pydantic设置继承抽象基类模式 | cmdragon's Blog
Pydantic多态模型:用鉴别器构建类型安全的API接口 | cmdragon's Blog
FastAPI性能优化指南:参数解析与惰性加载 | cmdragon's Blog
FastAPI依赖注入:参数共享与逻辑复用 | cmdragon's Blog
FastAPI安全防护指南:构建坚不可摧的参数处理体系 | cmdragon's Blog
FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 | cmdragon's Blog
FastAPI 核心机制:分页参数的实现与最佳实践 | cmdragon's Blog
<a href="https://blog.cmdragon.cn/posts/615a966b68d9/" target="_blank" rel="noopener nofollow">FastAPI 错误处理与自定义错误消息完全指南:构建坚固的 API 应用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
星球的眼睛
论坛元老
这个人很懒什么都没写!
楼主热帖
体系集成项目招标要诀
Java项目:基于SSM框架实现的康健综合 ...
微调神器LLaMA-Factory官方保姆级教程 ...
防止邮箱发信泄露服务器IP教程 ...
Git必知必会根本(07):git diff的利 ...
xmind父主题快捷键Ctrl+Enter
CMake构建学习笔记11-minizip库的构建 ...
【Neo4j】Windows11使用Neo4j导入CSV数 ...
Ubuntu上安装Chrome浏览器
第三篇【传奇开心果系列】Python的自动 ...
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表