如何在SQLAlchemy的order_by子句中传入变量?
实现运行时动态指定SQLAlchemy查询的排序字段
方法1:使用getattr映射模型属性
你可以通过getattr()函数将字符串形式的字段名转换为OrgModel对应的类属性,再搭配排序方法(asc()/desc())实现动态排序:
order_field = 'name' order_direction = 'desc' # 可切换为 'asc' 控制排序方向 # 获取模型对应的字段对象 sort_column = getattr(OrgModel, order_field) # 根据方向生成排序规则 sort_rule = sort_column.desc() if order_direction == 'desc' else sort_column.asc() # 执行查询 result = db.session.scalars(select(OrgModel).order_by(sort_rule)).all()
方法2:建立字段映射字典(更安全)
如果要避免非法字段名导致的错误,可以预先定义允许排序的字段映射,限制可选范围:
# 定义允许排序的字段映射表 allowed_sort_fields = { 'id': OrgModel.id, 'name': OrgModel.name } order_field = 'name' order_direction = 'asc' # 从映射表获取字段,默认用id兜底 sort_column = allowed_sort_fields.get(order_field, OrgModel.id) sort_rule = sort_column.asc() if order_direction == 'asc' else sort_column.desc() result = db.session.scalars(select(OrgModel).order_by(sort_rule)).all()
关键说明
- SQLAlchemy的
order_by()需要接收列对象而非字符串,直接传字符串会触发错误; - 使用
getattr时要确保字段名存在于模型中,否则会抛出AttributeError; - 字典映射的方式能有效过滤非法字段输入,提升代码安全性。
内容的提问来源于stack exchange,提问作者froopydoop
相关产品推荐
相关产品推荐

