Peewee查询基于仅在运行时知道的列

时间:2017-05-08 22:19:08

标签: python sql orm peewee

我目前正在构建一个SQL查询(在Python中):

query = "SELECT * FROM Table WHERE (" + \
    " OR ".join([firstType+'=1' for firstType in firstTypes]) + \
    ") AND (" + \
    " OR ".join([secondType+'=1' for secondType in secondTypes]) + \
    ")"

,给定两个列表firstType=['B','F']secondType=['a','d']会生成查询

SELECT * FROM Table WHERE ( ('B'=1 OR 'F'=1) AND ('a'=1 OR 'd'=1) )

我用Table.raw(query)执行。

我知道如何在Peewee中生成特定的查询,例如:

Table.select().where( (Table.B=1 | Table.F=1) & (Table.a=1 | Table.d=1) )

但问题是我事先并不知道这两个列表(即列)的内容。

如何根据仅在运行时知道的(强大的)列动态构建Peewee查询?

1 个答案:

答案 0 :(得分:1)

这很简单 - 您只需使用field = getattr(MyModel, 'field_name')field = MyModel._meta.fields['field_name']

然后你可能会生成一个表达式列表:

data = {'field_a': 1, 'field_b': 33, 'field_c': 'test'}
clauses = []
for key, value in data.items():
    field = MyModel._meta.fields[key]
    clauses.append(field == value)

要将 AND 所有条款放在一起,您可以:

import operator
expr = reduce(operator.and_, clauses) # from itertools import reduce in Py3

他们:

import operator
expr = reduce(operator.or_, clauses)

最后一步是将其放入查询的where()子句中。