如何在Async SQLAlchemy 2.0中为SELECT查询动态添加多个Options
解决Async SQLAlchemy 2.0动态添加查询选项的问题
SQLAlchemy 2.0中的Select对象是不可变的,调用filter()、options()这类方法时,不会修改原对象,而是返回一个全新的Select实例。你之前分步调用时没有重新赋值变量,所以原query根本没被更新,自然不会应用这些过滤条件和加载选项。
分步调用的正确写法
要让分步调用生效,必须把每次方法调用的返回值重新赋值给query变量:
query = select(model) # 重新赋值,获取添加过滤条件后的新查询对象 query = query.filter(model.id == item_id) # 同样重新赋值,应用加载选项 query = query.options(select_options[0])
循环添加多个选项的两种方案
方案一:遍历选项列表逐个添加
如果有多个加载选项需要动态添加,可以遍历选项列表,每次调用options()后重新赋值:
from sqlalchemy.orm import selectinload # 定义你的加载选项列表 select_options = [ selectinload(Table.entity1).selectinload(Table2.entity2), selectinload(Table.entity3) ] # 初始化查询 query = select(model).filter(model.id == item_id) # 循环添加所有选项 for option in select_options: query = query.options(option)
方案二:参数解包一次性传入
options()方法本身支持接收多个参数,所以可以直接用*解包选项列表,一次性完成添加,写法更简洁:
query = select(model).filter(model.id == item_id).options(*select_options)
内容的提问来源于stack exchange,提问作者Jon Hayden
相关产品推荐
相关产品推荐

