2011-09-02 46 views
0

我正在更新並將訂閱源中的項目(可能有大約40000個項目)一次添加到數據存儲200個項目,問題是訂閱源可能會更改並且某些項目可能會從Feed中刪除。 我有這樣的代碼:如何刪除未在GAE中的訂閱源中找到的實體

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對於該供稿項都是唯一的,並且是一致的。

+1

最簡單的可能是比你開始的日期時間更早的東西,不是嗎?或者假設你沒有經常更新,實際上在此之前的一段時間可能是謹慎的,以避免任何時鐘偏移錯誤或類似錯誤。使用'auto_now = True'的DateTimeProperty。 –

+0

並刪除我開始之前更新的所有實體? – Shedokan

+1

是的。或者可能在某處設置「我不關心任何在datetime X之前的任何內容」,並將其用作所有查詢中對該實體類型的篩選。如果由於未能從Feed中提取任何項目而沒有清空數據庫,可能會更輕鬆地處理將來發生的問題。 –

回答

2

,它會記錄每個實體的最後修改時間。由於您更新了Feed中的每個項目,因此當您完成這些項目時,他們將會在您開始的那一刻之後有所有時間,因此在此之前有日期的任何項目都不再處於Feed中。

澤維爾的世代計數器一樣好 - 我們所需要的是保證在刷新之間增加的東西,並且在刷新期間永不減少。

從文檔中不確定,但我期望DateTimeProperty大於IntegerProperty。後者是一個64位整數,所以它們可能可能是是相同的大小,或者它可能是DateTimeProperty存儲幾個整數。 A group post建議也許它是10個字節,而不是8個。

但請記住,通過添加一個額外的屬性來進行查詢,無論如何您都要添加另一個索引,因此字段大小的差異會按比例稀釋的開銷。而且,即使在0.24美元/ G /月的情況下,幾個字節的40k次也不算多。

無論是生成還是日期時間,您都不一定必須立即刪除數據。您的其他查詢可能會過濾最近一次刷新的日期/時間,這意味着您不必立即刪除數據。如果Feed(或您的分析)變得有趣並且無法生成任何項目,或者只生成一些項目,那麼最後一次刷新作爲備份可能會很有用。完全取決於應用程序是否值得擁有。

1

如果添加DateTimeProperty的與auto_now=True我想補充的一代計數器

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) 
+0

什麼是「代標記」?你忘記了一個逗號在def updateFeed – Shedokan

+1

生成標記只是你在兩次解析之間增加的一個整數,它有助於區分哪些解析是當前的,哪些是較舊的。事實上,你可以只使用兩個int,但我增加的更好 –

+0

這幾乎和Steve Jessop的想法一樣好,但是你依賴於feed而不是在同一個更新週期中給予我相同的項目。這有時會發生在我的情況 – Shedokan

相關問題