sqlalchemy IS NOT NULL select

102

Como posso adicionar o filtro como no SQL para selecionar valores NÃO NULL em uma determinada coluna?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Como posso fazer o mesmo com os filtros SQLAlchemy?

select = select(table).select_from(table).where(all_filters) 
Salamey
fonte
O que está all_filtersaqui? Por que select_from?
Martijn Pieters
E você tem uma definição de tabela ou precisa usar literais de coluna?
Martijn Pieters

Respostas:

136

column_obj != Noneirá produzir uma IS NOT NULLrestrição :

Em um contexto de coluna, produz a cláusula a != b. Se o alvo for None, produz a IS NOT NULL.

ou use isnot()(novo em 0.7.9):

Implemente o IS NOToperador.

Normalmente, IS NOTé gerado automaticamente ao comparar com um valor de None, que resolve para NULL. No entanto, o uso explícito de IS NOTpode ser desejável em comparação com valores booleanos em certas plataformas.

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
fonte
8
"Não é nenhum" produz o mesmo resultado?
Breezer
21
@Breezer: não, porque isnão pode ser sobrecarregado por classes personalizadas do jeito que !=pode ser.
Martijn Pieters
3
A outra resposta é a preferida agora; ele também evita que muitos IDEs, incluindo o PyCharm, gerem avisos.
Antti Haapala
@AnttiHaapala: Não tenho certeza se é 'preferencial'. A documentação SQLAlchemy cita os booleanos como um caso de uso mais importante. Eu adicionei essa opção.
Martijn Pieters
97

A partir da versão 0.7.9, você pode usar o operador de filtro em .isnotvez de comparar restrições, como esta:

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

Este método só é necessário se pep8 for uma preocupação.

fonte: documentação sqlalchemy

Filipe Spindola
fonte
5
Além de deixar pep8 feliz, acho que esta é uma solução melhor porque NULLnão é válida como o RHS do !=SQL e o uso isnottransmite melhor suas intenções para o que você deseja que a instrução gerada pareça.
Josh
1
@Josh: SQLAlchemy não emitirá != NULLno entanto, mesmo se você usar column != Noneno lado do Python; você consegue IS NOT NULL. Usar .isnot()permite que você force IS NOT outros tipos (pense .isnot(True)em colunas booleanas, por exemplo).
Martijn Pieters
43

Caso alguém esteja se perguntando, você pode usar is_para gerar foo IS NULL:

>>> da coluna de importação sqlalchemy.sql
>>> imprimir coluna ('foo'). is_ (Nenhum)
foo IS NULL
>>> imprimir coluna ('foo'). isnot (Nenhum)
foo NÃO É NULO
Matthew Moisen
fonte
1
Obrigado, é isso que eu estava procurando, mas o Google me enviou aqui!
Sinister Beard