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) 

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'

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


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

1
Merci, c'est ce que je cherchais mais Google m'a envoyé ici!
— Sinister Beard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.