sqlalchemy НЕ НУЛЬНИЙ вибір


104

Як я можу додати фільтр як у SQL для вибору значень, які НЕ НУЛІ з певного стовпця?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Як я можу зробити те саме за допомогою фільтрів SQLAlchemy?

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

Що all_filtersтут? Чому саме select_from?
Мартін Пітерс

А у вас є визначення таблиці або вам потрібно використовувати літерали стовпців?
Мартін Пітерс

Відповіді:


137

column_obj != Noneстворить IS NOT NULLобмеження :

У контексті стовпця створює пропозицію a != b. Якщо ціль є None, видає a 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'

8
Чи "не є" дає однакові результати?
Breezer

21
@Breezer: ні, тому що isкористувацькі класи не можуть їх перевантажити!= може бути.
Мартін Пітерс

3
Інша відповідь - найкраща відповідь зараз; це також дозволяє уникнути створення багатьох попереджувальних середовищ, включаючи PyCharm.
Антті Хаапала

@AnttiHaapala: Я не впевнений, чи є це "кращим". Документація SQLAlchemy посилається на логічні значення як на більш важливий варіант використання. Я додав цей варіант.
Мартін Пітерс

99

Починаючи з версії 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)проти логічних стовпців).
Мартін Пітерс

43

Якщо хтось ще задається питанням, ви можете використовувати is_для генераціїfoo IS NULL :

>>> зі стовпця імпорту sqlalchemy.sql
>>> стовпець друку ('foo'). is_ (немає)
foo - НУЛЬ
>>> стовпець друку ('foo'). isnot (None)
foo НЕ НУЛЬ

1
Дякую, це те, що я шукав, але Google надіслав мене сюди!
Зловісна Борода
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.