Python 如何删除GAE提要中未找到的实体

Python 如何删除GAE提要中未找到的实体,python,google-app-engine,google-cloud-datastore,feed,Python,Google App Engine,Google Cloud Datastore,Feed,我正在更新一个提要中的项目(可能有大约40000个项目)并将其添加到数据存储中,一次更新200个项目,问题是提要可能会更改,一些项目可能会从提要中删除。 我有以下代码: class FeedEntry(db.Model): name = db.StringProperty(required=True) def updateFeed(offset, number=200): response = fetchFeed(offset, number) feedItems =

我正在更新一个提要中的项目(可能有大约40000个项目)并将其添加到数据存储中,一次更新200个项目,问题是提要可能会更改,一些项目可能会从提要中删除。 我有以下代码:

class FeedEntry(db.Model):
    name = db.StringProperty(required=True)

def updateFeed(offset, number=200):
    response = fetchFeed(offset, number)
    feedItems = parseFeed(response)
    feedEntriesToAdd = []
    for item in feedItems:
        feedEntriesToAdd.append(
            FeedEntry(key_name=item.id, name=item.name)
        )
    db.put(feedEntriesToAdd)
如何找出哪些项不在提要中,并将其从数据存储中删除? 我想创建一个项目列表(在数据存储中),然后从列表中删除我更新的所有项目,剩下的将是要删除的项目。-但这似乎相当缓慢


PS:All item.id对于该提要项是唯一的,并且是一致的。

我将添加一个生成计数器

class FeedEntry(db.Model):
    name = db.StringProperty(required=True)
    generation = db.IntegerProperty(required=True)
def updateFeed(offset, generation, number=200):
    response = fetchFeed(offset, number)
    feedItems = parseFeed(response)
    feedEntriesToAdd = []
    for item in feedItems:
        feedEntriesToAdd.append(
            FeedEntry(key_name=item.id, name=item.name,generation=generation)
        )
    db.put(feedEntriesToAdd)
def deleteOld(generation):
    q = db.GqlQuery("SELECT * FROM FeedEntry " +
            "WHERE generation != :1" ,generation )
    db.delete(generation)

我会添加一个生成计数器

class FeedEntry(db.Model):
    name = db.StringProperty(required=True)
    generation = db.IntegerProperty(required=True)
def updateFeed(offset, generation, number=200):
    response = fetchFeed(offset, number)
    feedItems = parseFeed(response)
    feedEntriesToAdd = []
    for item in feedItems:
        feedEntriesToAdd.append(
            FeedEntry(key_name=item.id, name=item.name,generation=generation)
        )
    db.put(feedEntriesToAdd)
def deleteOld(generation):
    q = db.GqlQuery("SELECT * FROM FeedEntry " +
            "WHERE generation != :1" ,generation )
    db.delete(generation)

如果添加带有
auto\u now=True
的DateTimeProperty,它将记录每个实体的上次修改时间。因为你更新了提要中的每一项,当你完成时,它们都会在你开始的那一刻之后出现,所以任何在那之前有日期的东西都不会再出现在提要中

Xavier的生成计数器也一样好——我们所需要的是保证在刷新之间增加,而在刷新期间从不减少

从文档中不确定,但我希望DateTimeProperty大于IntegerProperty。后者是一个64位整数,因此它们的大小可能相同,也可能是DateTimeProperty存储了多个整数。可能是10字节,而不是8字节

但请记住,通过添加一个额外的属性来进行查询,实际上是在添加另一个索引,因此字段大小的差异会被稀释为开销的一部分。此外,即使是$0.24/G/月,40k乘以几个字节也不算多


对于generation或datetime,您不必立即删除数据。您的其他查询可以根据最新刷新的日期/生成进行过滤,这意味着您不必立即删除数据。如果feed(或您对它的解析)出现问题,无法生成任何项,或者只生成少数项,那么将最后一次刷新作为备份可能会很有用。完全取决于应用程序是否值得拥有。

如果添加带有
auto\u now=True
的DateTimeProperty,它将记录每个实体的上次修改时间。因为你更新了提要中的每一项,当你完成时,它们都会在你开始的那一刻之后出现,所以任何在那之前有日期的东西都不会再出现在提要中

Xavier的生成计数器也一样好——我们所需要的是保证在刷新之间增加,而在刷新期间从不减少

从文档中不确定,但我希望DateTimeProperty大于IntegerProperty。后者是一个64位整数,因此它们的大小可能相同,也可能是DateTimeProperty存储了多个整数。可能是10字节,而不是8字节

但请记住,通过添加一个额外的属性来进行查询,实际上是在添加另一个索引,因此字段大小的差异会被稀释为开销的一部分。此外,即使是$0.24/G/月,40k乘以几个字节也不算多


对于generation或datetime,您不必立即删除数据。您的其他查询可以根据最新刷新的日期/生成进行过滤,这意味着您不必立即删除数据。如果feed(或您对它的解析)出现问题,无法生成任何项,或者只生成少数项,那么将最后一次刷新作为备份可能会很有用。完全取决于应用程序是否值得拥有。

最简单的可能是比您启动时的日期时间更早的东西,不是吗?或者,如果您不经常更新,实际上在更新前一段时间可能是谨慎的,以避免任何时钟偏差或类似错误。将DateTimeProperty与
auto\u now=True
一起使用,并删除启动前更新的所有实体?是。或者在某处设置一个“我不关心datetime X之前的任何事情”值,并在对该实体类型的所有查询中使用该值作为过滤器。如果您没有因为未能从提要中提取任何项而清空数据库,那么将来可能会更容易处理出错的问题。但您不认为这只是浪费数据存储空间(代价高昂)吗?当然,您最终可以删除它们,只是我以前写过从提要更新数据库的代码,当提要提供者出现故障并临时为您提供一个空提要时,这有点烦人。完全取决于你是否需要一个“备份”的代价,是否考虑一个错误而不是一个真正的更新来说明不再有任何项目是有意义的。最简单的可能是比你开始的日期时间更大的事情,不是吗?或者,如果您不经常更新,实际上在更新前一段时间可能是谨慎的,以避免任何时钟偏差或类似错误。将DateTimeProperty与
auto\u now=True
一起使用,并删除启动前更新的所有实体?是。或者在某处设置一个“我不关心datetime X之前的任何事情”值,并在对该实体类型的所有查询中使用该值作为过滤器。如果您没有因为未能从提要中提取任何项而清空数据库,那么将来可能会更容易处理出错的问题。但您不认为这只是浪费数据存储空间(代价高昂)吗?当然,您最终可以删除它们,只是我以前写过从提要更新数据库的代码,当提要提供者出现故障并临时为您提供一个空提要时,这有点烦人。完全取决于你是否需要一个“备份”的代价,是否考虑一个错误而不是一个真正的更新来说明不再有任何项目是有意义的。你忘了在def updateFeeda中用逗号