You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQLAlchemy创建FALSE字面量对象遇错,如何解决?

问题描述

我编写了一个返回BinaryExpression的函数,将其传入Query.filter()方法中。项目使用mypy,因此必须指定返回类型,示例如下:

def get_conditions() -> BinaryExpression:
    return User.name == 'Andrew'

但有时函数需要返回FALSE条件,以生成SQL语句中的WHERE False。我尝试通过以下方式解决:

from sqlalchemy.sql import ColumnElement, False_

def get_conditions(forbidden: bool) -> ColumnElement:
    if forbidden:
        return False_

    return User.name == 'Andrew'

运行程序时出现错误:

sqlalchemy.exc.ArgumentError: SQL expression for WHERE/HAVING role expected, got <class 'sqlalchemy.sql.elements.False_'>.

运行mypy时也出现错误:

Incompatible return value type (got "Type[False_]", expected "ColumnElement[Any]")

请问问题出在哪里?是否应该使用ColumnElement之外的类型?我不想使用1=0这类魔术数字表达式,因为这种写法略显笨拙。


解决方案

问题根源

你直接返回了False_类本身,而不是它的实例。False_是SQLAlchemy定义的用于生成FALSE SQL表达式的类,必须通过实例化(加括号)才能得到合法的SQL表达式对象,否则SQLAlchemy无法识别,mypy也会因为类型不匹配报错。

修正后的代码

只需要给False_加上括号创建实例,返回类型ColumnElement完全适用,无需更换:

from sqlalchemy.sql import ColumnElement, False_

def get_conditions(forbidden: bool) -> ColumnElement:
    if forbidden:
        return False_()  # 实例化False_类

    return User.name == 'Andrew'

说明

  • False_()会生成标准的FALSE SQL表达式,最终对应SQL中的WHERE FALSE,比1=0更规范简洁。
  • False_类继承自ColumnElement[bool],所以返回False_()完全符合ColumnElement的类型要求,mypy检查会通过。

内容的提问来源于stack exchange,提问作者julia uss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:52:45