SQLAlchemy Core 选择条件包含布尔表达式 'is False' 的位置



如何使用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() 
    ))

希望这有帮助!

最新更新