簡體   English   中英

如何刪除GAE資訊提供中找不到的實體

[英]How to delete entities not found in feed on GAE

我正在一次更新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)

如何找出資訊提供中沒有的項目,並將其從資料儲存庫中刪除? 我考慮過要創建一個項目列表(在數據存儲區中),然后從那里刪除所有我更新過的項目,剩下的就是要刪除的項目。 -但這似乎很慢。

PS:所有item.id對於該Feed項目都是唯一的,並且是一致的。

如果添加帶有auto_now=True的DateTimeProperty,它將記錄每個實體的最后修改時間。 由於您更新了Feed中的每個項目,因此到您完成操作時,它們都會在您開始的那一刻起就有時間了,因此日期之前的所有內容都不再位於Feed中。

Xavier的世代計數器同樣出色-我們所需要的只是保證在刷新之間增加,而在刷新期間絕不減少。

從文檔中不確定,但是我希望DateTimeProperty大於IntegerProperty。 后者是64位整數,因此它們的大小可能相同,也可能是DateTimeProperty存儲了幾個整數。 一組帖子顯示可能是10個字節而不是8個字節。

但是請記住,通過添加要查詢的額外屬性,無論如何都將添加另一個索引,因此字段大小的差異會被稀釋為開銷的一部分。 此外,即使按0.24美元/ G /月的價格,幾個字節的40k倍也不算多。

無論是生成時間還是日期時間,您都不必立即刪除數據。 您的其他查詢可能會根據最新刷新的日期/生成進行過濾,這意味着您不必立即刪除數據。 如果提要(或您對它的解析)變得很有趣並且無法產生任何項目,或者僅產生了一些項目,那么保留最后一次刷新作為備份可能很有用。 是否值得擁有完全取決於應用程序。

我會增加一個世代計數器

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM