Sélectionnez les Valeurs NULL dans SQLAlchemy
Voici mon (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);
Je veux sélectionner toutes les personnes qui sont pas connu pour être marié, c'est à dire, y compris ceux avec NULL marriage_status.
Cela ne pas travail --
test=> select * from people where marriage_status != 'married' ;
name | marriage_status
------+-----------------
May | single
(1 row)
Bien sûr, cela ne --
test=> select * from people where marriage_status != 'married'
or marriage_status is NULL ;
name | marriage_status
------+-----------------
May | single
Joe |
Le problème c'est que je suis accéder à partir de SQLAlchemy avec --
...filter(or_(people.marriage_status!='married',
people.marriage_status is None))
qui se traduit à --
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 ne pas travail --
test=> select * from people where marriage_status != 'married'
or False;
name | marriage_status
------+-----------------
May | single
(1 row)
n' --
test=> select * from people where marriage_status != 'married'
or NULL;
name | marriage_status
------+-----------------
May | single
(1 row)
Comment choisir les valeurs NULL par le biais de SQLAlchemy?
Vous devez vous connecter pour publier un commentaire.
(comme indiqué par @augurar): Parce que sqlalchemy utilise méthodes magiques (surcharge d'opérateur) pour créer
SQL
constructions, il ne peut gérer qu'opérateur comme!=
ou==
, mais n'est pas en mesure de travailler avecis
(qui est un très Python construire).Donc, pour le faire fonctionner avec sqlalchemy, vous devez utiliser:
essentiellement de remplacer le
is None
avec== None
. Dans ce cas, votre requête sera traduit correctement pour le SQL suivant:Voir
IS NULL
dans le la documentation.# noinspection PyComparisonWithNone,PyPep8
est tout simplement parfaitDepuis SQLAlchemy 0.7.9 vous pouvez utiliser le
is_
méthode de la colonne.Une expression de filtre comme:
filter(or_(people.marriage_status!='married', people.marriage_status.is_(None)))
va générer le SQL paramétrée:
WHERE people.marriage_status != %(status_1)s OR people.marriage_status IS NULL
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 une colonne opérateur EST (PAS) la valeur NULL à maintenant, mais il sera
en attendant, vous pouvez utiliser soit:
filtre(tablename.is_deleted.op("n'EST PAS")(Vrai))
filtre(coalescer(tablename.is_deleted, False) != True)
.is_
et.isnot
depuis 0.7.9, cela devrait donc être considérée comme obsolète.