如何在SQLAlchemy ORM的func.json_build_object()的CASE中使用AND/OR
在SQLAlchemy ORM的func.json_build_object()的CASE语句中使用AND/OR逻辑
问题场景
尝试在SQLAlchemy的CASE表达式中结合AND逻辑判断两个条件,但运行时触发了NotImplementedError错误。
尝试代码
case( [((Employee.join_date > inner_query.offset(1).limit(1).subquery().c.last_synced_date) and (Employee.join_date < datetime.datetime(2022,11,14) ), True], _else = False, )
报错信息
File "/var/task/sqlalchemy/sql/elements.py", line 869, in operate return op(self.comparator, *other, **kwargs) File "/var/task/sqlalchemy/sql/operators.py", line 440, in __getitem__ return self.operate(getitem, index) File "/var/task/sqlalchemy/sql/type_api.py", line 77, in operate return o[0](self.expr, op, *(other + o[1:]), **kwargs) File "/var/task/sqlalchemy/sql/default_comparator.py", line 181, in _getitem_impl _unsupported_impl(expr, op, other, **kw) File "/var/task/sqlalchemy/sql/default_comparator.py", line 185, in _unsupported_impl raise NotImplementedError( NotImplementedError: Operator 'getitem' is not supported on this expression
问题原因
- 误用了Python原生的
and运算符,而非SQLAlchemy提供的SQL逻辑运算符。Python的and会触发本地布尔求值,无法被SQLAlchemy解析为SQL中的AND语句。 - 代码存在语法错误:第二个条件
Employee.join_date < datetime.datetime(2022,11,14)缺少闭合括号,导致表达式结构混乱。
解决方案
用SQLAlchemy的&(对应SQL的AND)或|(对应SQL的OR)运算符替代Python原生逻辑符,同时用括号包裹每个条件(因为&/|的优先级高于比较运算符),修正语法错误:
# 提取子查询,优化代码可读性 sub_query = inner_query.offset(1).limit(1).subquery() # 修正后的CASE语句 case_statement = case( [ ( (Employee.join_date > sub_query.c.last_synced_date) & (Employee.join_date < datetime.datetime(2022, 11, 14)), True ) ], _else=False )
补充说明
- 若需要OR逻辑,将
&替换为|即可,同样要给每个条件加括号。 - 确保所有表达式都被SQLAlchemy正确解析为SQL语句,避免混用Python原生运算符和SQLAlchemy表达式运算符。
内容的提问来源于stack exchange,提问作者Aravindh
相关产品推荐
相关产品推荐

