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?
(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 .
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)