如何使用SQLAlchemy表达式语言选择where where condition来检查布尔表达式.例:
select([table]).\
where(and_(table.c.col1 == 'abc',
table.c.is_num is False
))
Run Code Online (Sandbox Code Playgroud)
这不会给出语法错误,但会错误地评估条件.我不能使用== False给出错误.SQLAlchemy Core v.1.0.8
根据文档,处理此问题的方法是使用可以从 SqlAlchemy 导入的 true() 或 false() 常量。它看起来像这样:
from sqlalchemy import false
select([table]).\
where(and_(table.c.col1 == 'abc',
table.c.is_num == false()
))
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
该身份比较操作is
不能在Python超载,所以
table.c.is_num is False
Run Code Online (Sandbox Code Playgroud)
比较Column
对象的身份False
,并且因为它们显然不是同一个对象,所以评估为False.通过
我不能使用== False给出错误
你可能意味着一些符合PEP-8的 Python linter 会给你一个警告.检查对True或False的相等性仍然是有效的Python,虽然在一般意义上是unpythonic - 但它在SQLAlchemy过滤器中确实有意义并且它在文档中使用.例如:
In [5]: t.c.bar == False
Out[5]: <sqlalchemy.sql.elements.BinaryExpression object at 0x7fdc355a1da0>
In [6]: print(_)
foo.bar = false
Run Code Online (Sandbox Code Playgroud)
但是:不是将布尔值与布尔值进行比较,而是可以使用值本身:
select([table]).\
where(and_(table.c.col1 == 'abc',
~table.c.is_num
))
Run Code Online (Sandbox Code Playgroud)
这将转化为(大约):
SELECT ... FROM table WHERE col1 = 'abc' AND NOT is_num
Run Code Online (Sandbox Code Playgroud)
因为SQLAlchemy的ColumnOperators
超载__invert__
来not_()
.某些后端可能不支持布尔类型,但SQLAlchemy处理转换:
In [6]: print((~t.c.bar).compile(dialect=sqlite.dialect()))
foo.bar = 0
Run Code Online (Sandbox Code Playgroud)