sqlalchemy IS NOT NULL auswählen

99

Wie kann ich den Filter wie in SQL hinzufügen, um Werte, die NICHT NULL sind, aus einer bestimmten Spalte auszuwählen?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Wie kann ich dasselbe mit SQLAlchemy-Filtern tun?

select = select(table).select_from(table).where(all_filters) 
salamey
quelle
Was ist all_filtershier Warum das select_from?
Martijn Pieters
Und haben Sie eine Tabellendefinition oder müssen Sie Spaltenliterale verwenden?
Martijn Pieters

Antworten:

135

column_obj != Nonewird eine IS NOT NULLEinschränkung erzeugen :

Erzeugt in einem Spaltenkontext die Klausel a != b. Wenn das Ziel ist None, wird a erzeugt IS NOT NULL.

oder verwenden isnot()(neu in 0.7.9):

Implementieren Sie den IS NOTOperator.

Normalerweise IS NOTwird beim Vergleich mit einem Wert von automatisch generiert None, der in aufgelöst wird NULL. Eine explizite Verwendung von IS NOTkann jedoch wünschenswert sein, wenn sie auf bestimmten Plattformen mit booleschen Werten verglichen wird.

Demo:

>>> 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
quelle
8
Erzeugt "ist nicht keine" dieselbe Ausgabe?
Breezer
21
@Breezer: Nein, da isdies nicht durch benutzerdefinierte Klassen überladen werden !=kann.
Martijn Pieters
3
Die andere Antwort ist jetzt die bevorzugte Antwort; Außerdem wird vermieden, dass viele IDEs, einschließlich PyCharm, Warnungen generieren.
Antti Haapala
@AnttiHaapala: Ich bin nicht sicher, ob es "bevorzugt" ist. In der SQLAlchemy-Dokumentation werden Boolesche Werte als wichtigerer Anwendungsfall genannt. Ich habe diese Option hinzugefügt.
Martijn Pieters
96

Ab Version 0.7.9 können Sie den Filteroperator verwenden, .isnotanstatt Einschränkungen wie folgt zu vergleichen:

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

Diese Methode ist nur erforderlich, wenn pep8 ein Problem darstellt.

Quelle: sqlalchemy Dokumentation

Filipe Spindola
quelle
4
Abgesehen davon, dass pep8 glücklich gemacht wird, denke ich, dass dies eine bessere Lösung ist, da NULLes nicht als RHS von !=in SQL gültig ist und die Verwendung von isnotbesser Ihre Absichten darüber vermittelt, wie die generierte Anweisung aussehen soll.
Josh
1
@Josh: SQLAlchemy wird jedoch nicht ausgegeben != NULL, selbst wenn Sie es column != Noneauf der Python-Seite verwenden. du bekommst IS NOT NULL. Mit .isnot()können Sie jedoch andere Typen erzwingen IS NOT (denken Sie beispielsweise .isnot(True)an boolesche Spalten).
Martijn Pieters
43

Falls sich jemand wundert, können Sie Folgendes is_generieren foo IS NULL:

>>> aus der Importspalte sqlalchemy.sql
>>> Spalte drucken ('foo'). is_ (Keine)
foo ist null
>>> Spalte drucken ('foo'). isnot (Keine)
foo ist nicht null
Matthew Moisen
quelle
1
Danke, das habe ich gesucht, aber Google hat mich hierher geschickt!
Unheimlicher Bart