sqlalchemy NO ES NULO seleccione

104

¿Cómo puedo agregar el filtro como en SQL para seleccionar valores que NO son NULL de una determinada columna?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

¿Cómo puedo hacer lo mismo con los filtros SQLAlchemy?

select = select(table).select_from(table).where(all_filters) 
salamey
fuente
¿Qué hay all_filtersaquí? ¿Por qué el select_from?
Martijn Pieters
¿Tiene una definición de tabla o necesita usar literales de columna?
Martijn Pieters

Respuestas:

137

column_obj != Noneproducirá una IS NOT NULLrestricción :

En un contexto de columna, produce la cláusula a != b. Si el objetivo es None, produce un IS NOT NULL.

o use isnot()(nuevo en 0.7.9):

Implementar el IS NOToperador.

Normalmente, IS NOTse genera automáticamente cuando se compara con un valor de None, que se resuelve en NULL. Sin embargo, el uso explícito de IS NOTpuede ser deseable si se compara con valores booleanos en ciertas plataformas.

Manifestación:

>>> 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
fuente
8
¿"No es Ninguno" produce el mismo resultado?
Breezer
21
@Breezer: no, porque las isclases personalizadas no pueden sobrecargarlo !=.
Martijn Pieters
3
La otra respuesta es la respuesta preferida ahora; también evita que muchos IDE, incluido PyCharm, generen advertencias.
Antti Haapala
@AnttiHaapala: No estoy seguro de si es 'preferido'. La documentación de SQLAlchemy cita los valores booleanos como un caso de uso más importante. He agregado esa opción.
Martijn Pieters
99

A partir de la versión 0.7.9, puede usar el operador de filtro en .isnotlugar de comparar restricciones, así:

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

Este método solo es necesario si pep8 es una preocupación.

fuente: documentación sqlalchemy

Filipe Spindola
fuente
5
Más allá de hacer feliz a pep8, creo que esta es una mejor solución porque NULLno es válida como el RHS de !=en SQL y el uso isnottransmite mejor sus intenciones de cómo desea que se vea la declaración generada.
Josh
2
@Josh: SQLAlchemy no emitirá != NULLsin embargo, incluso si lo usa column != Noneen el lado de Python; obtienes IS NOT NULL. Sin embargo, el uso le .isnot()permite forzar IS NOT otros tipos (piense .isnot(True)en columnas booleanas, por ejemplo).
Martijn Pieters
43

En caso de que alguien más se lo pregunte, puede usar is_para generar foo IS NULL:

>>> de la columna de importación sqlalchemy.sql
>>> imprimir columna ('foo'). is_ (Ninguno)
foo ES NULO
>>> imprimir columna ('foo'). isnot (Ninguno)
foo NO ES NULO
Matthew Moisen
fuente
1
Gracias, esto es lo que estaba buscando, ¡pero Google me envió aquí!
Sinister Beard