【问题标题】:SQLAlchemy - Error on nested CASESQLAlchemy - 嵌套 CASE 错误
【发布时间】: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


【解决方案1】:

正如 Ilja Everilä 所写,原因是“IS None”,需要替换为

table_instance.c.work_order_number.is_(None)

table_instance.c.work_order_number == None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多