如何正确在SQLAlchemy中使用动态过滤?FastAPI仓库模式报错修复
问题修复方案
错误原因
你遇到的报错是因为SQLAlchemy的filter()方法需要接收一个或多个SQL布尔表达式,但你传入的是一个生成器对象,而非有效的表达式集合。生成器本身无法被SQLAlchemy解析为查询条件,因此抛出ArgumentError。
修复方案(三种可选)
方案1:解包生成器表达式
修改get_query方法,用*解包生成器,将每个过滤表达式作为独立参数传入filter():
from sqlalchemy.orm import Session from . import models class MessageRepository: def __init__(self, db:Session): self.db = db def get_query(self, **filters): # 生成过滤表达式并解包传入filter filter_exprs = (getattr(models.Messages, attr) == value for attr, value in filters.items()) return self.db.query(models.Messages).filter(*filter_exprs).all() def inbox(self, user): # 直接传递关键字参数,匹配**filters的定义 return self.get_query(receiver=user)
方案2:使用filter_by简化代码
如果你的过滤条件都是直接匹配模型字段的相等条件,SQLAlchemy的filter_by()方法更简洁,它直接接受关键字参数,无需手动调用getattr:
from sqlalchemy.orm import Session from . import models class MessageRepository: def __init__(self, db:Session): self.db = db def get_query(self, **filters): # filter_by直接接收关键字参数,自动映射模型字段 return self.db.query(models.Messages).filter_by(**filters).all() def inbox(self, user): return self.get_query(receiver=user)
方案3:保持字典传参的方式
如果你需要保持inbox方法中传字典的调用方式,可修改get_query接收字典参数:
from sqlalchemy.orm import Session from . import models class MessageRepository: def __init__(self, db:Session): self.db = db def get_query(self, filters): filter_exprs = (getattr(models.Messages, attr) == value for attr, value in filters.items()) return self.db.query(models.Messages).filter(*filter_exprs).all() def inbox(self, user): return self.get_query(filters={'receiver': user})
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

