【发布时间】:2013-01-17 12:22:35
【问题描述】:
我的计划是通过随机选择其中一个键并检查数据存储区中对它的引用来删除孤立的 blob(每十秒左右重复一次)。有没有办法得到那个列表?
【问题讨论】:
-
您是否尝试过使用keys_only?类似于:q = Person.all(keys_only=True)
标签: google-app-engine blobstore
我的计划是通过随机选择其中一个键并检查数据存储区中对它的引用来删除孤立的 blob(每十秒左右重复一次)。有没有办法得到那个列表?
【问题讨论】:
标签: google-app-engine blobstore
您要查找的方法是 BlobInfoFactory 上的 queryBlobInfos() 方法。它将为您提供所有存储的 blob,您可以检查并删除孤儿。不知道为什么这不在 BlobstoreService 上。 https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/blobstore/BlobInfoFactory#queryBlobInfos()
【讨论】:
当您在数据存储中有引用时,您可以获取文件名并删除孤儿。
blob_key = # you have stored
blob_info = blobstore.BlobInfo.get(blob_key)
blobs = blobstore.BlobInfo.gql("WHERE filename = '%s'" %(blob_info.filename))
for blob in blobs :
if blob.key() != blob_key : # do not delete the referenced one
blob.delete()
当然,您也可以使用 gql 查询所有 blob 并将其与您的参考进行比较。
【讨论】:
根据 Goose 的回答,这是我在实验后清理所有开发混乱的方式:
private BlobInfoFactory blobInfoFactory = new BlobInfoFactory();
private void deleteAllBlobs() {
Iterator<BlobInfo> blobsIterator = blobInfoFactory.queryBlobInfos();
while (blobsIterator.hasNext()) {
BlobInfo blobInfo = (BlobInfo) blobsIterator.next();
LOG.info("Removing blob " + blobInfo.getFilename());
blobstoreService.delete(blobInfo.getBlobKey());
}
}
【讨论】: