Построение OR WHERE программно в Peewee

У меня есть список ключевых слов с неизвестным количеством элементов, таких как:

['key1', 'key2', 'key3']

Мне нужно построить запрос с помощью Peewee, где имя столбца должно быть %LIKE% одним из слов в списке.

Пример SQL:

SELECT * 
FROM t 
WHERE name LIKE '%key1%' OR 
name LIKE '%key2%' OR
name LIKE '%key3%'

В документации похоже, что я могу построить запрос так:

T.select().where(T.name ** 'key1' | T.name ** 'key2' | T.name ** 'key3')

Это не похоже, что его можно построить программно, хотя...

Как я могу решить эту проблему?


person Francesco Meli    schedule 04.11.2018    source источник


Ответы (1)


Используйте сокращение и оператор «или_» из стандартной библиотеки:

clauses = [
    (T.name ** 'key1'),
    (T.name ** 'key2'),
    (T.name ** 'key3')]
expr = reduce(operator.or_, clauses)
query = T.select().where(expr)
person coleifer    schedule 05.11.2018
comment
Фантастика, спасибо! - person Francesco Meli; 05.11.2018
comment
побочный эффект: вы получаете большой беспорядок в скобках, но, надеюсь, это не повлияет на скорость. - person maugch; 13.08.2019