2015-04-24 47 views
3

我的AppEngine服務器有大量未在BlobStore中使用的孤立Blob。我想編寫代碼來遍歷所有的blob,並檢查它們是否未被使用,然後刪除。我找不到一種方法來遍歷BlobStore。這可能嗎?清理AppEngine BlobStore

+0

是有一個blobstore瀏覽器,所以你至少可以看到它們? –

+0

在AppEngine儀表板中,它會顯示一個東西列表。但它沒有告訴你正在使用或不使用什麼。所以這就是爲什麼我需要編寫一段代碼來迭代它們,並執行一些數據存儲查詢來檢查它們是否正在被使用......但首先我需要迭代。 – tmoore

+0

儀表板中找到的斑點列表在哪裏? –

回答

1

您可以通過數據存儲查詢列出https://cloud.google.com/appengine/docs/go/blobstore/reference#BlobInfo(儘管此類查詢最終一致)。

+0

從該頁面:'注意:Files API已於2013年6月11日棄用(v1.8.1),並且即將關閉,此時這些功能將不再起作用。改爲使用Google雲端存儲(https://cloud.google.com/storage/).' –

+0

我想這就是爲什麼谷歌很難與Blobstore合作。 –

+0

非常感謝!這裏有一些GQL工作:「SELECT * FROM __BlobInfo__」 - 抱歉不顯示正確,但在前後添加3個下劃線。 – tmoore

0

這裏是在golang遍歷斑點代碼解決方案:

c.Infof("Iterating over blobs") 
q := datastore.NewQuery("__BlobInfo__") 

// Iterate over the results. 
total := 0 
t := q.Run(c) 
for { 
     var bi blobstore.BlobInfo 
     _, err := t.Next(&bi) 
     if err == datastore.Done { 
       break 
     } 
     if err != nil && isErrFieldMismatch(err) == false { 
       c.Errorf("Error fetching next Blob: %v", err) 
       break 
     } 
     // Do something with the Blob bi 
     c.Infof("Got blob [%v] of size [%v]", bi.ContentType, bi.Size) 
     total++ 
     if total > 100 { break } 
} 
c.Infof("Iterating Done") 

您還需要使用此功能忽略場失配誤差:

func isErrFieldMismatch(err error) bool { 
    _, ok := err.(*datastore.ErrFieldMismatch) 
    return ok 

}

相關問題