【发布时间】:2018-08-16 21:03:39
【问题描述】:
我想将 SQL 转移到 SQLAlchemy 并有我嵌套了 case 语句的情况。
简单的案例是有效的:
stmt = sqlalchemy.select([self.tusg_view_specials]).where(
sqlalchemy.case([
(self.tusg_view_specials.c.webo_close_date >= (datetime.date.today() - datetime.timedelta(days=30)), 1),
(self.tusg_view_specials.c.wo_closed_date >= (datetime.date.today() - datetime.timedelta(days=61)), 1)
], else_=0),
)
但是当我有一个嵌套的 case 时,意味着 THEN 是一个 case 子句而不是一个简单的值:
stmt = sqlalchemy.select([self.tusg_view_specials]).where(
sqlalchemy.case([
(self.tusg_view_specials.c.webo_close_date >= (datetime.date.today() - datetime.timedelta(days=30)), 1),
(self.tusg_view_specials.c.wo_closed_date >= (datetime.date.today() - datetime.timedelta(days=61)), 1),
(self.tusg_view_specials.c.work_order_number is None,
sqlalchemy.case([(self.tusg_view_specials.c.flag_is_abw == 1, 1)], else_=0))
], else_=0), <<-- This line is shown to cause the error
)
收到如下错误信息,不知道如何处理:
sqlalchemy.exc.ArgumentError: Ambiguous literal: False. Use the 'text()' function to indicate a SQL expression literal, or 'literal()' to indicate a bound value.
我可以阅读文本,但不知道如何解释它。 SQLAlchemy 上“嵌套案例”的搜索结果几乎没有。
【问题讨论】:
-
问题不是嵌套大小写,而是
self.tusg_view_specials.c.work_order_number is None。标识运算符不能重载,因此该表达式在 Python 中的计算结果为 False。你的意思是self.tusg_view_specials.c.work_order_number.is_(None)?
标签: sqlalchemy