【问题标题】:Cleaning up the AppEngine BlobStore清理 AppEngine BlobStore
【发布时间】:2015-04-24 16:26:11
【问题描述】:

我的 AppEngine 服务器有很多 BlobStore 中未使用的孤立 Blob。我想编写代码来遍历所有 blob 并检查它们是否没有被使用然后删除。我找不到迭代 BlobStore 的方法。这可能吗?

【问题讨论】:

  • 是否有 blobstore 查看器,您至少可以看到它们?
  • 在 AppEngine 仪表板中,它会向您显示内容列表。但它并没有告诉你正在使用什么。所以这就是为什么我需要编写一段代码来遍历它们并进行一些数据存储查询以检查它们是否被使用......但首先我需要迭代。
  • 在仪表板中找到的 Blob 列表在哪里?
  • 在“Blob 查看器”下的旧采访中。新界面好像没有。 appengine.google.com

标签: google-app-engine go


【解决方案1】:

您可以通过数据存储查询列出https://cloud.google.com/appengine/docs/go/blobstore/reference#BlobInfo(尽管这样的查询最终是一致的)。

【讨论】:

  • 来自该页面:NOTE: The Files API was deprecated on June 11, 2013 (v1.8.1) and will be shut down soon, at which point these functions will no longer work. Use Google Cloud Storage instead (https://cloud.google.com/storage/).
  • 我想这就是 Google 难以与 Blobstore 合作的原因。
  • 非常感谢!以下是一些有效的 GQL:“SELECT * FROM BlobInfo
【解决方案2】:

这是一个在 golang 中迭代 blob 的代码解决方案:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2014-10-27
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多