使用GQL获取自上一个结果以来的所有新结果

时间:2013-03-13 17:48:34

标签: python google-app-engine gql gqlquery

在查询时我很无用,我想知道这个问题的正确结构是什么。

客户端被发送包括对象密钥的数据,他们使用密钥告诉服务器他们下载的最新对象是什么。

我希望从那时起获取所有对象,对象具有自动日期属性。

此外,我希望能够将15个(或左右)最新对象提供给可能请求使用特定“新用户”密钥或类似内容的新用户。

使用Python2.7运行时,之前从未使用过GQL,

非常感谢任何帮助。

模型类是这样的:

class Message(db.Model):
    user = db.StringProperty()
    content = db.TextProperty()
    colour = db.StringProperty()
    room = db.StringProperty()
    date = db.DateTimeProperty(auto_now_add=True)

1 个答案:

答案 0 :(得分:1)

如果它是db.Key对象或使用db(而不是ndb)API的键的字符串表示形式:

last_message = Message.get(lastkey)

如果您有其他表示形式的密钥,例如密钥名称:

last_message = Message.get_by_key_name(lastkey)

如果您将密钥作为对象的数字ID:

last_message = Message.get_by_id(int(lastkey))

然后,您可以获取自上一条消息以来的消息,如下所示:

messages_since_last_message = Message.all().filter('date >', last_message.date).order('date')
#OR GQL:
messages_since_last_message = Message.gql("WHERE date > :1 ORDER BY date ASC", last_message.date)

您应该只使用>=比较器,因为可能有多条消息在相同的时间到达,然后过滤掉列表中的所有消息,包括您正在查找的最后一个密钥for(这实际上取决于您的用例以及消息的编写方式)。此外,使用High Replication数据存储区,最终会保持一致性,因此除非您使用祖先查询,否则无法保证您的查询准确反映数据存储区,在这种情况下,您将实体组限制为每秒大约1次写入,这取决于你的用例,可能不是问题。这里的实体组反映了父模型及其所有子女的祖先。祖先组驻留在一个实体组中。