1

我想使用Pony动态构建查询,但我想将过滤器与OR而不是 with结合起来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%'

有没有办法到达那里?

4

1 回答 1

0

如今,您不能将过滤器与 or 一起使用。总有一天我们会实现这一点。

我可以给你一些字符串的解决方法。

在 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 rangenotfor kw in keywords来避免 python 注入,因为此代码将被评估。

于 2019-01-05T10:31:34.950 回答