2010-07-15 59 views
2

嗨,我讀了一些關於這個主題的帖子,可以說我想刪除給定類db.model的每個對象,如LinkRating2,有沒有一種方法可以在啓動時用一個簡單的命令刪除它?我以爲我記得在某個地方看過 - 例如--clear datastore ?,否則我一直在嘗試sdk控制檯中的各種方法,但似乎都是內存崩潰,因爲該文件永遠只是加載和啓動我不認爲有任何記憶留下了大聲笑。那麼什麼是最好的代碼方法來刪除整個實體?如何輕鬆刪除谷歌應用程序引擎中的整個db.model類?

class LinkRating2(db.Model): 
    user = db.StringProperty() 
    link = db.StringProperty() 
    rating2 = db.FloatProperty() 

試過,但這個是超級慢

results2 = LinkRating2.all() 
results = results2.fetch(500) 

while results: 
    db.delete(results) 
    results = results2.fetch(500) 

回答

2

有沒有辦法用一個簡單的命令來刪除它在啓動時 ?我以爲我 記得看到這個地方,例如 - 清除數據存儲?

如果你在談論開發服務器,是的。 dev_appserver.py --clear_datastore myapp將啓動一個新的數據存儲。當你在本地工作時,這是最好的選擇。

我沒有理會把它在一段時間 循環,如想刪除所有一氣呵成 實體可能代表超過30秒 期限的 很好的機會。你只需要做到這一點 ,直到所有的實體都消失了。

如果你想消滅在生產給定類型的每個實體,這是一個很好的藉口,使用remote_api,而不是寫一個基於Web的處理器,既規避30秒的最後期限,並降低您的實體天體代碼偶然會被意外運行。

最後一兩件事:如果你想刪除一些實體,但你不希望打擾加載模型的定義,你可以使用低級別數據存儲API:

from google.appengine.api import datastore 

kind = 'LinkRating2' 
batch_size = 1000 

query = datastore.Query(kind=kind, keys_only=True) 
results = query.Get(batch_size) 
while results: 
    print "Deleting %d %s entities" % (batch_size, kind) 
    datastore.Delete(results) 
    results = query.Get(batch_size) 
2

你好得多比與整個實體按鍵簡單工作。查詢實體關鍵字比讀取整個實體要快得多,並且只需要鍵來刪除。

results = db.Query(LinkRating2, keys_only=True).fetch(1000) 
if len(results) > 0: 
    db.delete(results) 

我沒有理會把它在一個while循環,因爲試圖刪除所有一氣呵成實體可能代表超過30秒的最後期限的一個很好的機會。你只需要這樣做,直到所有的實體都消失了。

+0

我有大約10萬的實體我試着所有一次,打了太多的刪除api錯誤,所以我把一個循環如下,刪除實體的正常速率是什麼,它似乎很慢?仍在運行 – user291071 2010-07-15 20:33:24

0
results = db.Query(Final, keys_only=True).fetch(1000) 
while len(results) > 0: 
    db.delete(results) 
    results = db.Query(Final, keys_only=True).fetch(1000) 
0

--clear-datastore標誌將清除數據庫中的所有數據 - 而不僅僅是特定的類,因爲它看起來你想要的。

這個問題已經被問:Delete all data for a kind in Google App Engine

我想這個答案會爲你提供你想要的東西。它通過刪除其密鑰項目,這應該是要快得多: Delete all data for a kind in Google App Engine

+0

我發現該頁面可以清除數據存儲,因爲這樣會更快:) http://code.google.com/appengine/docs/python/tools/devserver.html – user291071 2010-07-15 21:00:20

+0

如果它適用於您所需的內容,那麼不錯。只要記住它會刪除所有內容,而不僅僅是特定的類,就像原文中提到的那樣。 – Cuga 2010-07-16 12:48:30