SQLAlchemy Core select where条件包含布尔表达式`是False`

时间:2018-01-16 05:20:20

标签: python sqlalchemy

如何使用SQLAlchemy表达式语言选择where where condition来检查布尔表达式。例如:

select([table]).\
    where(and_(table.c.col1 == 'abc',
               table.c.is_num is False 
    ))

这不会给出语法错误,但会错误地评估条件。我不能使用== False给出错误。 SQLAlchemy Core v.1.0.8

2 个答案:

答案 0 :(得分:5)

identity comparison operator is无法在Python中重载,所以

table.c.is_num is False

比较Column对象和False的身份,因为它们显然不是同一个对象,所以评估为False。由

  

我不能使用== False给出错误

你可能意味着一些符合PEP-8的Python linter会给你一个警告。检查对True或False的相等性仍然是有效的Python,虽然在一般意义上是unpythonic - 但它does make sense in SQLAlchemy filters并且它是used in the docs。例如:

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

答案 1 :(得分:1)

根据the documentation,您应该使用的方法是使用可以从SqlAlchemy导入的true()或false()常量。它看起来像这样:

from sqlalchemy import false

select([table]).\
    where(and_(table.c.col1 == 'abc',
               table.c.is_num == false() 
    ))

希望这有帮助!