使用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_()会生成标准的FALSESQL表达式,最终对应SQL中的WHERE FALSE,比1=0更规范简洁。False_类继承自ColumnElement[bool],所以返回False_()完全符合ColumnElement的类型要求,mypy检查会通过。
内容的提问来源于stack exchange,提问作者julia uss
相关产品推荐
相关产品推荐

