如何使用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
答案 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()
))
希望这有帮助!