我正在更新并将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项都是唯一的并且是一致的。
答案 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)