web-dev-qa-db-fra.com

Sélectionnez les valeurs NULL dans SQLAlchemy

Voici ma table (PostgreSQL) -

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);

Je veux sélectionner toutes les personnes qui sont pasconnues pour être mariées, c'est-à-dire, y compris celles avec NULL marriage_status.

Ceci ne pastravail -

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

Bien sûr que cela -

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

Le problème est que j'y accède depuis SQLAlchemy avec -

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

qui se traduit par -

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'}

Et est-ce que pasne marche pas -

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

non plus -

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

Comment sélectionner des valeurs NULL via SQLAlchemy?

35
Jerry

(comme indiqué par @augurar ): Étant donné que sqlalchemy utilise les méthodes magic (surcharge de l'opérateur) pour créer des constructions SQL, il ne peut gérer que des opérateurs tels que != ou ==, mais n'est pas en mesure de le faire. travailler avec is (qui est une construction Python très valide).

Par conséquent, pour que cela fonctionne avec sqlalchemy, vous devez utiliser: 

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

, remplacez fondamentalement le is None par == None. Dans ce cas, votre requête sera traduite correctement en SQL suivant:

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 != ?

Voir IS NULL dans la documentation .

82
van

j'ai rencontré un problème similaire

https://groups.google.com/forum/?fromgroups#!topic/sqlalchemy/EVpxsNp5Ifg%5B1-25%5D

réponse courte: - Il n'y a pas d'opérateur de colonne pour IS (NOT) NULL maintenant, mais il y aura

en attendant, vous pouvez utiliser soit:

filtre (nom_table.is_deleted.op ("N'est pas") (True)) 

filter (coalesce (nom_table.is_deleted, False)! = True) 

0
Jonathan Vanasco