TinyDB получить все идентификаторы в запросе списка

Я использую TinyDB в своем проекте Python. Однако, чтобы сделать логику эффективной, мне нужно иметь возможность получать несколько объектов в запросе. Я предпочел бы использовать список

listOfIDs = ['123', '456']

Я использую последнюю версию Python и реализацию TinyDB.

У меня есть следующая реализация:

from tinydb import TinyDB, Query
db = TinyDB('db.json')
myDBQuery= Query()
db.insert({'id': '123', 'name': 'bob'})
db.insert({'id': '456', 'name': 'mary'})
result = db.search(myDBQuery.id.all(['123', '456']))
print(result)

Тем не менее, я продолжаю получать следующее в результате:

[]

Я знаю, что моя реализация работает, потому что, когда я делаю следующее, я получаю ожидаемые результаты:

result = db.search((myDBQuery.id == '123') | myDBQuery.id == '456'))

Кто-нибудь знает, как сделать запрос со списком в TinyDB?

Кто-нибудь знает, как сделать запрос со списком в TinyDB?

РЕДАКТИРОВАТЬ

Для тех из вас, кто интересуется, нет способа сделать это с текущей реализацией. Мой единственный обходной путь - создать что-то вроде следующего

def getAllObjectsMatchingId(listOfIds):

tempList = []

for idMember in tempList:
    result = db.search(myDBQuery.id == idMember)
    tempList.append(result)

return tempList

1 ответ

Решение

.all возвращает true, только если все элементы списка соответствуют запросу

.any может работать вместо

result = db.search(myDBQuery.id.any(['123', '456']))

РЕДАКТИРОВАТЬ ИЗ ВОПРОСА OP: Пожалуйста, смотрите мое редактирование выше

Мне это кажется лучшим решением:

db.search(myDBQuery.id.test(lambda x: x in listOfIDs))

test () Соответствует любому документу, для которого функция возвращает True

Если кто-то все еще сталкивается с этим, альтернатива реализации Рейнальдо:

listOfIds = ['1','2','3']
q = Query()
db.search(q.id.one_of(listOfIds))

Взято из API запроса:

one_of(items: List[Any]) → tinydb.queries.QueryInstance
    Check if the value is contained in a list or generator.

Вы также можете отрицать запрос (что мне и нужно), чтобы получить элементы, которых нет в списке:

listOfIds = ['4','5']
q = Query()
db.search(~q.id.one_of(listOfIds))
Другие вопросы по тегам