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) 

¿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'

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


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

1
Gracias, esto es lo que estaba buscando, ¡pero Google me envió aquí!
Sinister Beard
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.