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) 

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'

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


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

1
Obrigado, é isso que eu estava procurando, mas o Google me enviou aqui!
— Sinister Beard
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.