Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

python - SQLAlchemy Core select where condition contains boolean expression `is False`

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...