sqlalchemy НЕ ПУСТО выберите


108

Как я могу добавить фильтр, как в SQL, для выбора значений, которые НЕ являются NULL из определенного столбца?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Как я могу сделать то же самое с фильтрами SQLAlchemy?

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

Что all_filtersздесь? Почему select_from?
Мартейн Питерс

А у вас есть определение таблицы или вам нужно использовать литералы столбцов?
Мартейн Питерс

Ответы:


144

column_obj != Noneсоздаст IS NOT NULLограничение :

В контексте столбца производит предложение a != b. Если цель есть None, производит IS NOT NULL.

или используйте isnot()(новое в 0.7.9):

Реализуйте IS NOTоператора.

Обычно IS NOTсоздается автоматически при сравнении со значением None, которое разрешается в NULL. Однако явное использование IS NOTможет быть желательным при сравнении с логическими значениями на определенных платформах.

Демо:

>>> 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
Выводит ли "is not None" такой же результат?
Breezer

23
@Breezer: нет, потому что isне может быть перегружен пользовательскими классами, как это !=может быть.
Мартейн Питерс

3
Другой ответ сейчас является предпочтительным; он также позволяет избежать генерации предупреждений во многих IDE, включая PyCharm.
Антти Хаапала

@AnttiHaapala: Я не уверен, что это «предпочтительнее». В документации SQLAlchemy логические значения упоминаются как более важный вариант использования. Я добавил эту опцию.
Мартейн Питерс

107

Начиная с версии 0.7.9 вы можете использовать оператор фильтра .isnotвместо сравнения ограничений, например:

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

Этот метод необходим только в том случае, если вас беспокоит pep8.

источник: документация sqlalchemy


5
Помимо радости pep8, я думаю, что это лучшее решение, потому что NULLоно недействительно, как RHS !=в SQL, и использование isnotлучше передает ваши намерения относительно того, как вы хотите, чтобы сгенерированный оператор выглядел.
Джош

2
@Josh: Однако SQLAlchemy не будет генерировать != NULL, даже если вы используете column != Noneна стороне Python; вы получите IS NOT NULL. Однако использование .isnot()позволяет принудительно использовать IS NOT другие типы (например, подумайте .isnot(True)о логических столбцах).
Мартейн Питерс

47

Если кому-то еще интересно, вы можете использовать is_для генерации foo IS NULL:

>>> из столбца импорта sqlalchemy.sql
>>> печать столбца ('foo'). is_ (Нет)
foo ЕСТЬ NULL
>>> print column ('foo'). isnot (Нет)
foo НЕ НУЛЬ

2
Спасибо, это то, что я искал, но Google отправил меня сюда!
Зловещая Борода
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.