Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select NULL Values in SQLAlchemy

Here's my (PostgreSQL) table --

test=> create table people (name varchar primary key,                             marriage_status varchar) ;   test=> insert into people values ('Ken', 'married'); test=> insert into people values ('May', 'single'); test=> insert into people values ('Joe', NULL); 

I want to select all people that are not known to be married, i.e., including those with NULL marriage_status.

This does not work --

test=> select * from people where marriage_status != 'married' ;   name | marriage_status  ------+-----------------  May  | single (1 row) 

Of course this does --

test=> select * from people where marriage_status != 'married'        or marriage_status is NULL ;   name | marriage_status  ------+-----------------  May  | single  Joe  |  

The problem is that I'm accessing it from SQLAlchemy with --

...filter(or_(people.marriage_status!='married',               people.marriage_status is None)) 

which gets translated to --

SELECT people.name as name,        people.marriage_status as marriage_status FROM people  WHERE people.marriage_status != %(status_1)s OR False sqlalchemy.engine.base.Engine.... {'status_1': 'married'} 

And does not work --

test=> select * from people where marriage_status != 'married'        or False;   name | marriage_status  ------+-----------------  May  | single (1 row) 

neither does --

test=> select * from people where marriage_status != 'married'        or NULL;   name | marriage_status  ------+-----------------  May  | single (1 row) 

How should I select NULL values through SQLAlchemy?

like image 363
Jerry Avatar asked Apr 09 '11 04:04

Jerry


People also ask

How to filter NULL values in SQLAlchemy?

Bookmark this question. Show activity on this post. test=> create table people (name varchar primary key, marriage_status varchar) ; test=> insert into people values ('Ken', 'married'); test=> insert into people values ('May', 'single'); test=> insert into people values ('Joe', NULL);

How do I select in SQLAlchemy?

The select() method of table object enables us to construct SELECT expression. The resultant variable is an equivalent of cursor in DBAPI. We can now fetch records using fetchone() method. Here, we have to note that select object can also be obtained by select() function in sqlalchemy.

What is nullable SQLAlchemy?

From SQLAlchemy docs: nullable – If set to the default of True, indicates the column will be rendered as allowing NULL, else it's rendered as NOT NULL. This parameter is only used when issuing CREATE TABLE statements.

IS NOT NULL operator in SQL?

Description. The IS NOT NULL condition is used in SQL to test for a non-NULL value. It returns TRUE if a non-NULL value is found, otherwise it returns FALSE. It can be used in a SELECT, INSERT, UPDATE, or DELETE statement.


2 Answers

For SQLAlchemy 0.7.8 and older

(as indicated by @augurar): Because sqlalchemy uses magic methods (operator overloading) to create SQL constructs, it can only handle operator such as != or ==, but is not able to work with is (which is a very valid Python construct).

Therefore, to make it work with sqlalchemy, you should use:

...filter(or_(people.marriage_status!='married', people.marriage_status == None)) 

, basically replace the is None with == None. In this case your query will be translated properly to the following SQL:

SELECT people.name AS people_name, people.marriage_status AS people_marriage_status  FROM people  WHERE people.marriage_status IS NULL OR people.marriage_status != ? 

See IS NULL in the documentation.

like image 87
van Avatar answered Sep 17 '22 02:09

van


Since SQLAlchemy 0.7.9 you may use the is_ (or is_not) method of the column.

A filter expression like:

filter(or_(people.marriage_status!='married', people.marriage_status.is_(None)))

will generate the parameterized SQL:

WHERE people.marriage_status != %(status_1)s OR people.marriage_status IS NULL

like image 30
jsnow Avatar answered Sep 18 '22 02:09

jsnow