sqlalchemy NON È NULL seleziona


104

Come posso aggiungere il filtro come in SQL per selezionare valori che NON sono NULL da una determinata colonna?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Come posso fare lo stesso con i filtri SQLAlchemy?

select = select(table).select_from(table).where(all_filters) 

Cosa c'è all_filtersqui? Perché il select_from?
Martijn Pieters

E hai una definizione di tabella o devi usare letterali di colonna?
Martijn Pieters

Risposte:


137

column_obj != Noneprodurrà un IS NOT NULLvincolo :

In un contesto di colonna, produce la clausola a != b. Se l'obiettivo è None, produce un file IS NOT NULL.

oppure usa isnot()(nuovo nella 0.7.9):

Implementa l' IS NOToperatore.

Normalmente, IS NOTviene generato automaticamente quando si confronta con un valore di None, che si risolve in NULL. Tuttavia, l'utilizzo esplicito di IS NOTpotrebbe essere desiderabile se si confrontano valori booleani su determinate piattaforme.

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'

8
"Non è Nessuno" produce lo stesso output?
Breezer

21
@Breezer: no, perché isnon può essere sovraccaricato dalle classi personalizzate come !=può essere.
Martijn Pieters

3
L'altra risposta è la risposta preferita ora; inoltre evita che molti IDE, incluso PyCharm, generino avvisi.
Antti Haapala

@ AnttiHaapala: non sono sicuro che sia "preferito". La documentazione di SQLAlchemy cita i booleani come un caso d'uso più importante. Ho aggiunto questa opzione.
Martijn Pieters

99

A partire dalla versione 0.7.9 è possibile utilizzare l'operatore di filtro .isnotinvece di confrontare i vincoli, in questo modo:

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

Questo metodo è necessario solo se pep8 è un problema.

fonte: documentazione sqlalchemy


5
Oltre a rendere felice pep8, penso che questa sia una soluzione migliore perché NULLnon è valida come RHS di !=in SQL e l'uso isnottrasmette meglio le tue intenzioni per come vuoi che sia l'istruzione generata.
Josh

2
@ Josh: SQLAlchemy non emetterà != NULLcomunque, anche se usi column != Nonesul lato Python; ottieni IS NOT NULL. L'uso .isnot()ti consente tuttavia di forzare IS NOT altri tipi (pensa .isnot(True)contro le colonne booleane, ad esempio).
Martijn Pieters

43

Nel caso in cui qualcun altro si stia chiedendo, puoi usare is_per generare foo IS NULL:

>>> dalla colonna di importazione sqlalchemy.sql
>>> colonna di stampa ('pippo'). is_ (Nessuno)
foo È NULL
>>> colonna di stampa ('pippo'). isnot (Nessuno)
foo NON È NULLO

1
Grazie, questo è quello che stavo cercando ma Google mi ha mandato qui!
Barba
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.