sqlalchemy IS NOT NULL select

104

Comment puis-je ajouter le filtre comme dans SQL pour sélectionner des valeurs qui ne sont PAS NULL dans une certaine colonne?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Comment puis-je faire de même avec les filtres SQLAlchemy?

select = select(table).select_from(table).where(all_filters) 
salamey
la source
Qu'y a-t-il all_filtersici? Pourquoi le select_from?
Martijn Pieters
Et avez-vous une définition de table ou avez-vous besoin d'utiliser des littéraux de colonne?
Martijn Pieters

Réponses:

136

column_obj != Noneproduira une IS NOT NULLcontrainte :

Dans un contexte de colonne, produit la clause a != b. Si la cible est None, produit un IS NOT NULL.

ou utilisez isnot()(nouveau dans 0.7.9):

Implémentez l' IS NOTopérateur.

Normalement, IS NOTest généré automatiquement lors de la comparaison à une valeur de None, qui se résout en NULL. Cependant, l'utilisation explicite de IS NOTpeut être souhaitable si on la compare à des valeurs booléennes sur certaines plates-formes.

Démo:

>>> from sqlalchemy.sql import column
>>> column('YourColumn') != None
<sqlalchemy.sql.elements.BinaryExpression object at 0x10c8d8b90>
>>> str(column('YourColumn') != None)
'"YourColumn" IS NOT NULL'
>>> column('YourColumn').isnot(None)
<sqlalchemy.sql.elements.BinaryExpression object at 0x104603850>
>>> str(column('YourColumn').isnot(None))
'"YourColumn" IS NOT NULL'
Martijn Pieters
la source
8
Est-ce que "n'est pas None" produit le même résultat?
Breezer
21
@Breezer: non, car isne peut pas être surchargé par des classes personnalisées comme cela !=peut l'être.
Martijn Pieters
3
L'autre réponse est la réponse préférée maintenant; cela évite également de nombreux IDE, y compris PyCharm, de générer des avertissements.
Antti Haapala
@AnttiHaapala: Je ne sais pas si c'est «préféré». La documentation SQLAlchemy cite les booléens comme cas d'utilisation plus important. J'ai ajouté cette option.
Martijn Pieters
99

À partir de la version 0.7.9, vous pouvez utiliser l'opérateur de filtre .isnotau lieu de comparer des contraintes, comme ceci:

query.filter(User.name.isnot(None))

Cette méthode n'est nécessaire que si pep8 est un problème.

source: documentation sqlalchemy

Filipe Spindola
la source
5
Au-delà de rendre pep8 heureux, je pense que c'est une meilleure solution car ce NULLn'est pas valide comme le RHS de !=SQL et l'utilisation de isnotmieux transmet vos intentions quant à ce à quoi vous voulez que l'instruction générée ressemble.
Josh le
2
@Josh: SQLAlchemy n'émettra != NULLcependant pas, même si vous utilisez column != Nonedu côté Python; vous obtenez IS NOT NULL. L'utilisation .isnot()vous permet cependant de forcer IS NOT sur d'autres types (pensez .isnot(True)aux colonnes booléennes, par exemple).
Martijn Pieters
43

Au cas où quelqu'un d'autre se demanderait, vous pouvez utiliser is_pour générer foo IS NULL:

>>> à partir de la colonne d'importation sqlalchemy.sql
>>> colonne d'impression ('toto'). is_ (Aucun)
foo EST NULL
>>> colonne d'impression ('toto'). isnot (Aucun)
foo N'EST PAS NULL
Matthew Moisen
la source
1
Merci, c'est ce que je cherchais mais Google m'a envoyé ici!
Sinister Beard