如何删除GAE上feed中未找到的实体

2024-04-26 23:11:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个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:全部项目id对于该提要项是唯一的,并且是一致的。你知道吗


Tags: 数据项目nameid密码numberdbresponse
2条回答

如果使用auto_now=True添加DateTimeProperty,它将记录每个实体的上次修改时间。既然你更新了feed中的每一个条目,那么当你完成的时候,它们都会在你开始的那一刻之后出现,所以任何在那之前有日期的东西都不会再出现在feed中了。你知道吗

Xavier的生成计数器也很好——我们所需要的只是在刷新之间保证增加,而在刷新期间不会减少。你知道吗

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

但是请记住,通过添加一个额外的属性来执行查询,您还是在添加另一个索引,因此字段大小的差异会被稀释为开销的一部分。此外,4万乘以几个字节,即使是0.24美元/克/月,也不算多。你知道吗

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

我会添加一个生成计数器

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)

相关问题 更多 >