Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLAlchemy Core select where condition contains boolean expression `is False` [duplicate]

How to use SQLAlchemy expression language to select columns with where condition to check boolean expression. example:

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

This doesn't give syntax error, but evaluates the condition wrong. I cannot use == False which gives error. SQLAlchemy Core v.1.0.8

like image 443
user956424 Avatar asked May 12 '26 22:05

user956424


2 Answers

The identity comparison operator is cannot be overloaded in Python, so

table.c.is_num is False

compares the identities of the Column object and False, and since they're clearly not the same object, evaluates to False. By

I cannot use == False which gives error

you probably mean that some Python linter adhering to PEP-8 gives you a warning. Checking equality against True or False is still valid Python, though unpythonic in the general sense – but it does make sense in SQLAlchemy filters and it is used in the docs. For example:

In [5]: t.c.bar == False
Out[5]: <sqlalchemy.sql.elements.BinaryExpression object at 0x7fdc355a1da0>

In [6]: print(_)
foo.bar = false

But: instead of comparing a boolean to a boolean you could use the value itself:

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

which would translate to (approximately):

SELECT ... FROM table WHERE col1 = 'abc' AND NOT is_num

since SQLAlchemy ColumnOperators overload the __invert__ to not_(). Some backends may not support a boolean type, but SQLAlchemy handles the conversion:

In [6]: print((~t.c.bar).compile(dialect=sqlite.dialect()))
foo.bar = 0
like image 104
Ilja Everilä Avatar answered May 14 '26 12:05

Ilja Everilä


According to the documentation, the way you should handle this is by using the true() or false() constants that you can import from SqlAlchemy. It would look like this:

from sqlalchemy import false

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

Hope this helps!

like image 38
Rohan Varma Avatar answered May 14 '26 13:05

Rohan Varma



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!