Я хотел бы динамически строить запрос, используя Пони, но я бы
хотелось бы комбинировать фильтры с OR
вместо AND
. Это,
Я хочу сделать что-то вроде этого:
keywords = ['gizmo', 'gadget']
query = select(w for w in Widget)
for kw in keywords:
query = query.filter(lambda w: kw in w.name)
for item in query:
print(item)
Проблема с вышеизложенным, конечно же, в том, что он будет производить запрос как:
SELECT "w"."id", "w"."name"
FROM "Widget" "w"
WHERE "w"."name" LIKE '%gizmo%'
AND "w"."name" LIKE '%gadget%'
А я хочу:
SELECT "w"."id", "w"."name"
FROM "Widget" "w"
WHERE "w"."name" LIKE '%gizmo%'
OR "w"."name" LIKE '%gadget%'
Есть ли способ добраться туда?
В настоящее время нельзя использовать фильтры с или. Когда-нибудь мы это реализуем.
Я могу предложить вам обходной путь со строками.
В Pony можно использовать строковую версию генераторов или фильтров. Нравится
select('w for w in Widget')
Это может быть полезно, если вы используете какое-то выражение, которое Pony не может декомпилировать. Например
select('s for s in Student if a < s.age < b')
Так что в вашем случае вы можете сделать это как
q = select(w for w in Widget)
q = q.filter(' or '.join('keywords[%d] in w.name' % i for i in range(len(keywords))))
Я использую for i in range
, а не for kw in keywords
, чтобы избежать инъекций Python, потому что этот код будет оцениваться.