【问题标题】:ORing filters together in Pony ORMPony ORM 中的 ORing 过滤器
【发布时间】:2018-12-18 17:25:15
【问题描述】:

我想使用Pony 动态构建查询,但我会 喜欢将过滤器与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%'

有什么办法可以到达吗?

【问题讨论】:

    标签: python ponyorm


    【解决方案1】:

    现在您不能将过滤器与 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 range 而不是for kw in keywords 来避免python 注入,因为此代码将被评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多