如何删除GAE中Feed中找不到的实体

时间:2011-09-02 12:25:57

标签: python google-app-engine google-cloud-datastore feed

我正在更新并将Feed中的项目(可以包含大约40000个项目)添加到数据存储区200个项目,问题是Feed可能会更改,某些项目可能会从Feed中删除。 我有这段代码:

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)

如何找出Feed中没有的项目并将其从数据存储区中删除? 我考虑过创建一个项目列表(在数据存储区中),然后从那里删除我更新的所有项目,剩下的项目将是要删除的项目。 - 但这似乎很慢。

PS:所有item.id对于该Feed项都是唯一的并且是一致的。

2 个答案:

答案 0 :(得分:2)

如果使用auto_now=True添加DateTimeProperty,它将记录每个实体的上次修改时间。由于您更新了Feed中的每个项目,因此当您完成时,它们将在您开始之后的所有时间都有,因此在此之前具有日期的任何内容都不再在Feed中。

Xavier的生成计数器同样出色 - 我们需要的是刷新之间保证增加的东西,并且在刷新期间永远不会减少。

不确定文档,但我希望DateTimeProperty大于IntegerProperty。后者是64位整数,因此它们可能的大小相同,或者可能是DateTimeProperty存储了几个整数。 A group post表示可能是10个字节而不是8个字节。

但请记住,通过添加一个额外的属性来进行查询,无论如何都要添加另一个索引,因此字段大小的差异会被稀释为开销的一部分。此外,几个字节的40k倍甚至不到0.24美元/ G /月。

无论是生成还是日期时间,您都不一定要立即删除数据。您的其他查询可以过滤最近刷新的日期/生成,这意味着您不必立即删除数据。如果feed(或你的解析)变得有趣并且无法生成任何项目,或者只产生一些项目,那么最后一次刷新作为备份可能是有用的。完全取决于应用程序是否值得拥有。

答案 1 :(得分:1)

我会添加一代计数器

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)