基于仅在运行时已知的列的 Peewee 查询
Peewee query based on columns known only at runtime
我目前正在构建一个 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 查询?
这很简单——您只需使用 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()
子句中。
我目前正在构建一个 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 查询?
这很简单——您只需使用 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()
子句中。