Моделирование данных с помощью AppEngine Python и запросов с диапазоном 'IN' - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть список адресов в виде строкового типа, и я хотел бы найти все события, значение местоположения которых совпадает с содержимым списка. Поскольку у меня есть тысячи таких записей, использование 'IN' с фильтром не будет работать, поскольку я превысил ограничение в 30 элементов / выборка.

Вот как я пытаюсь сделать фильтр:

# addresses come in as list of string items
addresses = ['123 Main St, Portland, ME', '500 Broadway, New York, NY', ...];

query = Event.all();
query.filter('location IN ', addresses);
# above causes the error: 
<class 'google.appengine.api.datastore_errors.BadArgumentError'>:
Cannot satisfy query -- too many subqueries (max: 30, got 119). 
Probable cause: too many IN/!= filters in query.

Мои классы моделей:

class Event(GeoModel):
  name = db.StringProperty();
  location = db.PostalAddressProperty();  

Есть ли лучший способ найти все записи, которые соответствуют определенным критериям?

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011

Нет другого способа обойти это, кроме множественных запросов - в конце концов, вы запрашиваете объединенные результаты набора запросов для разных адресов, и именно так в хранилище данных реализуются запросы IN.Возможно, вы захотите использовать ndb или асинхронные запросы, чтобы вы могли выполнять их параллельно.

Возможно, если вы объясните, чего вы пытаетесь достичь, мы можем предложить более эффективный подход.

0 голосов
/ 22 декабря 2015

GQL 'IN' не позволяет подзапросам больше 30. Для этой цели я разделил подзапросы на маленькие порции для менее чем или равных 30 подзапросов, и результат сохраняется в массиве.*

0 голосов
/ 08 сентября 2011

Простое решение / (взломать) было бы разбить ваш список адресов на списки по 30 каждый.Выполните 1 запрос на 30 местоположений, затем пересечение результатов запроса, чтобы получить события в каждом местоположении в исходном списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...