sqlalchemy NIE JEST NULL select


108

Jak mogę dodać filtr, tak jak w SQL, aby wybrać wartości, które NIE są NULL z określonej kolumny?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Jak mogę zrobić to samo z filtrami SQLAlchemy?

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

Co all_filterstu jest ? Dlaczego select_from?
— Martijn Pieters

Czy masz definicję tabeli, czy potrzebujesz użyć literałów kolumn?
— Martijn Pieters

Odpowiedzi:


143

column_obj != Nonestworzy IS NOT NULLograniczenie :

W kontekście kolumny tworzy klauzulę a != b. Jeśli celem jest None, tworzy plik IS NOT NULL.

lub użyj isnot()(nowy w 0.7.9):

Zaimplementuj IS NOToperatora.

Zwykle IS NOTsą generowane automatycznie, gdy w stosunku do wartości None, która postanawia NULL. Jednak wyraźne użycie IS NOTmoże być pożądane w porównaniu z wartościami logicznymi na niektórych platformach.

Próbny:

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

9
Czy „nie jest None” daje taki sam wynik?
— Breezer

23
@Breezer: nie, ponieważ isnie można go przeciążać niestandardowymi klasami tak, jak !=to możliwe.
— Martijn Pieters

3
Druga odpowiedź jest teraz preferowaną odpowiedzią; pozwala również uniknąć generowania ostrzeżeń przez wiele środowisk IDE, w tym PyCharm.
— Antti Haapala

@AnttiHaapala: Nie jestem pewien, czy jest to „preferowane”. Dokumentacja SQLAlchemy wymienia wartości logiczne jako ważniejszy przypadek użycia. Dodałem tę opcję.
— Martijn Pieters

105

Począwszy od wersji 0.7.9 możesz użyć operatora filtru .isnotzamiast porównywać ograniczenia, na przykład:

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

Ta metoda jest konieczna tylko wtedy, gdy pep8 jest problemem.

źródło: dokumentacja sqlalchemy


5
Oprócz uszczęśliwiania pep8, myślę, że jest to lepsze rozwiązanie, ponieważ NULLnie jest poprawne, jak RHS !=w SQL, a użycie isnotlepiej przekazuje twoje intencje dotyczące tego, jak ma wyglądać wygenerowana instrukcja.
— Josh

2
@Josh: SQLAlchemy nie wyemituje != NULLjednak, nawet jeśli używasz column != Nonepo stronie Pythona; masz IS NOT NULL. Użycie .isnot()pozwala jednak na wymuszenie IS NOT innych typów ( .isnot(True)na przykład pomyśl o kolumnach logicznych).
— Martijn Pieters

47

Jeśli ktoś się zastanawia, możesz użyć is_do wygenerowania foo IS NULL:

>>> z kolumny importu sqlalchemy.sql
>>> drukuj kolumnę ('foo'). is_ (Brak)
foo JEST NULL
>>> drukuj kolumnę ('foo'). isnot (None)
foo NIE JEST NULL

2
Dzięki, właśnie tego szukałem, ale Google przysłało mnie tutaj!
— Sinister Beard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.