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

use*_*424 1 python sqlalchemy

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

Roh*_*rma 5

根据文档,处理此问题的方法是使用可以从 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)

希望这可以帮助!


Ilj*_*ilä 5

身份比较操作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)