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) 
salamey
źródło
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'
Martijn Pieters
źródło
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

Filipe Spindola
źródło
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
Matthew Moisen
źródło
2
Dzięki, właśnie tego szukałem, ale Google przysłało mnie tutaj!
Sinister Beard