使用AppEngine python进行数据建模,使用“IN”范围进行查询

时间:2011-09-07 20:01:29

标签: python google-app-engine

我有一个地址列表作为字符串类型,我想找到其位置值与列表内容匹配的所有事件。因为我有数以千计的这样的条目,所以使用带过滤器的'IN'将无法正常工作,因为我超过了30项/ fetch的限制。

以下是我尝试过滤器的方法:

# 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 个答案:

答案 0 :(得分:3)

除了多个查询之外,没有办法解决这个问题 - 毕竟,您要求针对不同地址的一组查询的组合结果,这就是在数据存储区中实现'IN'查询的方式。您可能需要考虑使用ndb或异步查询,以便可以并行运行它们。

也许如果你解释一下你想要实现的目标,我们可以建议一种更有效的方法。

答案 1 :(得分:0)

一个简单的解决方案/(hack)就是将你的地址列表分成30个列表。每30个位置执行1次查询,然后获取查询结果的交集,以获取原始列表中每个位置的事件。

答案 2 :(得分:-1)

GQL'IN'不允许超过30个子查询。为此,我将子查询划分为小块,少于或等于30个子查询,并将结果存储到数组中。

main