如何使用SQLAlchemy表达式语言选择具有where条件的列以检查布尔表达式。 示例:
select([table]).
where(and_(table.c.col1 == 'abc',
table.c.is_num is False
))
这不会给出语法错误,但会错误地评估条件。我不能使用 == 假,这给出了错误。SQLAlchemy Core v.1.0.8
身份比较运算符 is
在 Python 中不能重载,所以
table.c.is_num is False
比较Column
对象和False
的恒等式,由于它们显然不是同一个对象,因此计算结果为 False。由
我不能使用 == 假,这给出了错误
你可能的意思是一些遵守PEP-8的Python短绒会给你一个警告。检查 True 或 False 的相等性仍然是有效的 Python,尽管在一般意义上是非 pythonic 的——但它在 SQLAlchemy 过滤器中确实有意义,并且在文档中使用。例如:
In [5]: t.c.bar == False
Out[5]: <sqlalchemy.sql.elements.BinaryExpression object at 0x7fdc355a1da0>
In [6]: print(_)
foo.bar = false
但是:与其将布尔值与布尔值进行比较,不如使用值本身:
select([table]).
where(and_(table.c.col1 == 'abc',
~table.c.is_num
))
这将转化为(大约(:
SELECT ... FROM table WHERE col1 = 'abc' AND NOT is_num
由于SQLAlchemy ColumnOperators
使__invert__
重载到not_()
。某些后端可能不支持布尔类型,但 SQLAlchemy 会处理转换:
In [6]: print((~t.c.bar).compile(dialect=sqlite.dialect()))
foo.bar = 0
根据文档,您应该使用可以从 SqlAlchemy 导入的 true(( 或 false(( 常量来处理此问题。它看起来像这样:
from sqlalchemy import false
select([table]).
where(and_(table.c.col1 == 'abc',
table.c.is_num == false()
))
希望这有帮助!