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 отправил меня сюда!
Зловещая Борода