1
是否可以在TinyDB中動態構建查詢?它的邏輯查詢操作是這樣的:動態解析和構建TinyDB查詢
>>> from tinydb import TinyDB, where
>>> db = TinyDB('db.json')
>>> # Logical AND:
>>> db.search((where('int') == 1) & (where('char') == 'b'))
[{'int': 1, 'char': 'b'}]
但我需要從用戶的輸入條件動態構建查詢。我能想出的唯一辦法是連接的條件爲一個字符串和exec
這樣說:
#!/usr/bin/env python3
import shlex
from tinydb import TinyDB, where
# create db sample
db = TinyDB('test.json')
db.insert({'id': '1', 'name': 'Tom', 'age': '10', 'grade': '4'})
db.insert({'id': '2', 'name': 'Alice', 'age': '9', 'grade': '3'})
db.insert({'id': '3', 'name': 'John', 'age': '11', 'grade': '5'})
db.close()
# query test
db = TinyDB('test.json')
q = input("query for name/age/grade: ")
# name='Tom' grade='4'
qdict = dict(token.split('=') for token in shlex.split(q))
result = []
query = "result = db.search("
qlen = len(qdict)
count = 0
for key, value in qdict.items():
query += "(where('%s') == '%s')" % (key, value)
count += 1
if count < qlen:
query += " & "
query += ')'
exec(query)
print(result)
# [{'age': '10', 'id': '1', 'grade': '4', 'name': 'Tom'}]
是否還有更好的和優雅的方式來做到這一點?非常感謝。
我真的很感激你的精心編碼。看起來核心的魔法就是使用'操作員'模塊,我之前並不知道這個模塊。順便說一句,Python 3已將'reduce()'移動到'functools'模塊中,Guido在[https://docs.python.org/3.0/whatsnew/3.0.html](Python 3.0中的新增功能)中說:「Removed' reduce()'。如果你確實需要它,可以使用'functools.reduce();但是,99%的時間顯式for循環更具可讀性。「我想你的代碼佔了1%的時間。 :-) – AlvaPan
我很高興你覺得這有用;我希望別人也會! –