如何在Go上删除app引擎中的所有blob?

时间:2014-01-26 04:36:33

标签: google-app-engine go blobstore

blobstore API没有列出所有blob的功能。如何获取此列表然后删除所有blob?

1 个答案:

答案 0 :(得分:5)

on appengine for go的blobstore API无法执行此操作。而是使用数据存储区将__BlobInfo__实体提取为appengine.BlobInfo。虽然API声称拥有BlobKey field,但却没有填充。而是使用返回键的字符串ID并将其强制转换为appengine.BlobKey,然后您可以将其传递给blobstore.Delete

这是“/ tasks / delete-blobs”中的处理程序,可以在循环中一次删除20k blob,直到它们全部被删除。另请注意,此处不使用游标。我怀疑__BlobInfo__是特殊的,不支持游标。 (当我试图使用它们时,它们什么也没做。)

func DeleteBlobs(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    c = appengine.Timeout(c, time.Minute)
    q := datastore.NewQuery("__BlobInfo__").KeysOnly()
    it := q.Run(ctx)
    wg := sync.WaitGroup{}
    something := false
    for _i := 0; _i < 20; _i++ {
        var bk []appengine.BlobKey
        for i := 0; i < 1000; i++ {
            k, err := it.Next(nil)
            if err == datastore.Done {
                break
            } else if err != nil {
                c.Errorf("err: %v", err)
                continue
            }
            bk = append(bk, appengine.BlobKey(k.StringID()))
        }
        if len(bk) == 0 {
            break
        }
        go func(bk []appengine.BlobKey) {
            something = true
            c.Errorf("deleteing %v blobs", len(bk))
            err := blobstore.DeleteMulti(ctx, bk)
            if err != nil {
                c.Errorf("blobstore delete err: %v", err)
            }
            wg.Done()
        }(bk)
        wg.Add(1)
    }
    wg.Wait()
    if something {
        taskqueue.Add(c, taskqueue.NewPOSTTask("/tasks/delete-blobs", nil), "")
    }
}