2011-11-29 92 views
5

GQL reference名单__key__,鼓励使用IN关键字与值的列表,并从手构建一个关键的GQL查询GQL查询与键

SELECT * FROM MyModel WHERE __key__ = KEY('MyModel', 'my_model_key') 

会成功。然而,使用的代码,你会期望工作:

SELECT * FROM MyModel WHERE __key__ IN (KEY('MyModel', 'my_model_key1'), 
             KEY('MyModel', 'my_model_key2')) 
在数据存储浏览器

,还有的投诉“无效的GQL查询字符串。”

格式化这种查询的正确方法是什么?

更新:这是不可能与当前的SDK。正如我在我的评论中指出的那样,当使用列表时,只有引用(例如:1:email)或int,float,string,boolean或null文字是可接受的列表条目。

第二次更新:我修复了这个错误,现在可以执行这样的查询。您可以在Google Code Hosting diff中找到Fix。

PS我知道有更有效的方式来在Python中完成此操作(无需构建GQL查询)并使用remote_api,但每次调用remote_api都会违反配额。在配额不是(必然)免费的环境中,快速和肮脏的查询非常有用。

+0

您是否真的认为在控制台中手动获取的实体数量将增加大量消耗的配额,如果您是通过remote_api实现的? –

+0

不需要。我只是想知道如何正确构建查询。我的文章中的第二个片段看起来不会是“无效的GQL查询字符串”。 “WHERE __key__ IN”是否是无效的GQL? – bossylobster

+0

虽然我仍然困惑你为什么要这样做。这是获取实体的特别低效的方式。 –

回答

1

fix实施后,从原来的职位代码片段就足够了:

SELECT * FROM MyModel WHERE __key__ IN (KEY('MyModel', 'my_model_key1'), 
             KEY('MyModel', 'my_model_key2')) 

PS我意识到我的原帖评论可能不如一个答案,未来的观众足够清晰。

2

我不明白。您的目标是在数据存储查看器中查看实体的特定列表以避免消耗配额?我不知道的方式与GQL做到这一点,但如果你知道你可以直接访问他们的实体按键,例如:

https://appengine.google.com/datastore/edit?app_id=myapp&key=key1

https://appengine.google.com/datastore/edit?app_id=myapp&key=key2

如果你在代码中这样做,请不要尝试使用GQL。使用db.get(keys)或类似的东西。

+0

我没有使用'db.get'或'MyModel.get_by_key_name'或'MyModel.get_by_id'的问题。希望知道如何做到这一点,这个问题得到了加强。就像我刚才提到的那样,甚至可以用SELECT * FROM MyModel WHERE __key__ = KEY('MyModel','my_model_key')来完成单个查询(就像查询字符串中的'key ='一样)。 – bossylobster