Як об’єднати два стовпці та застосувати фільтр? Наприклад, я хочу одночасно шукати як у стовпцях «ім’я», так і «прізвище». Ось як я це робив, шукаючи лише один стовпець:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
Як об’єднати два стовпці та застосувати фільтр? Наприклад, я хочу одночасно шукати як у стовпцях «ім’я», так і «прізвище». Ось як я це робив, шукаючи лише один стовпець:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
Відповіді:
Є кілька способів це зробити:
Використання filter()
( та оператора)
query = meta.Session.query(User).filter(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
Використання filter_by()
( та оператора)
query = meta.Session.query(User).filter_by(
firstname.like(search_var1),
lastname.like(search_var2)
)
Мережа filter()
або filter_by()
( і оператор)
query = meta.Session.query(User).\
filter_by(firstname.like(search_var1)).\
filter_by(lastname.like(search_var2))
Використовуючи or_()
, and_()
іnot()
from sqlalchemy import and_, or_, not_
query = meta.Session.query(User).filter(
and_(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
)
filter_by
документах кажуть , що це для фільтрації за ключовим словом аргументу: query(Foo).filter_by(bar='baz')
. Як це пов’язано із синтаксисом, який ви використали у вашій відповіді вище?
Ви можете просто зателефонувати filter
кілька разів:
query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
filter(User.lastname.like(searchVar2))
filter()
методів та використанням комбінації декількох умов (by or_
або and_
) в одному filter
, на великих таблицях mysql?
filter
викликів діяти як логічні, AND
а не як OR
?
Ви можете використовувати or_
функцію SQLAlchemy для пошуку в більш ніж одному стовпці (підкреслення необхідне, щоб відрізнити його від власного Python or
).
Ось приклад:
from sqlalchemy import or_
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar),
User.lastname.like(searchVar)))
|
оператор замість or_
, як цей - (User.firstname.like(searchVar)) | (User.lastname.like(searchVar))
, однак слід бути обережним з |
пріоритетом, без дужок він може дати ДУЖЕ несподівані результати при змішуванні з операторами порівняння.
filter.or_( case1, case 2)
?
Загальний фрагмент коду, який буде працювати для декількох стовпців. Це також можна використовувати, якщо є необхідність умовно реалізувати функціональність пошуку в додатку.
search_key = "abc"
search_args = [col.ilike('%%%s%%' % search_key) for col in ['col1', 'col2', 'col3']]
query = Query(table).filter(or_(*search_args))
session.execute(query).fetchall()
Примітка: %%
важливо пропустити% форматування запиту.