如何在Python Google Cloud Function中设置blob的元数据?测试失败,报错”blob.size = 99 AttributeError: can’t set attribute”

58次阅读
没有评论

问题描述

在Python Google Cloud Function中尝试从内部将Google Cloud Storage文件的rowcount添加到元数据中。他遵循了官方Cloud Storage文档中的示例,尝试以与示例代码相同的方式更改属性:

from google.cloud import storage

def set_blob_metadata(bucket_name, blob_name):
    """Set a blob's metadata."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.get_blob(blob_name)
    metadata = {'color': 'Red', 'name': 'Test'}
    blob.metadata = metadata
    blob.patch()
    print("The metadata for the blob {} is {}".format(blob.name, blob.metadata))

但是在日志中,他的代码报错:

blob.size = 99 AttributeError: can't set attribute"

他想知道如何使用Python的google_cloud_storage包写入属性。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

解决方案1

根据用户提供的代码和错误信息,问题出在尝试直接设置blob.size属性上。blob.size是一个只读属性,无法直接设置。要写入元数据,需要使用blob.metadata属性。
以下是一个修复后的示例代码:

from os import environ
from google.cloud import storage

def set_blob_metadata(bucket_name, blob_name):
    """Set a blob's metadata."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(environ["BUCKET_NAME"])
    blob = bucket.get_blob(environ["FILE_NAME_TEST"])
    print("Size: {} bytes".format(blob.size))
    print("Custom Time: {}".format(blob.custom_time))
    metadata = {'rowcount': 99}
    blob.metadata = metadata
    blob.patch()
    print("The metadata for the blob {} is {}".format(blob.name, blob.metadata))

在上面的示例中,我们将blob.size = 99替换为metadata = {'rowcount': 99},然后将metadata赋值给blob.metadata属性。这样就可以成功写入元数据了。

请注意,blob.metadata属性是一个字典,你可以根据需要添加其他属性。

解决方案2

在用户提供的最佳回答中,他解释了如何正确设置元数据。blob.metadata属性是一个字典,你需要将要保存的属性添加到这个字典中。以下是他提供的示例代码:

def set_blob_metadata(bucket_name, blob_name):
    """Set a blob's metadata."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.get_blob(blob_name)
    metadata = {'rowcount': 555}
    blob.metadata = metadata
    blob.patch()
    print("The metadata for the blob {} is {}".format(blob.name, blob.metadata))

在上面的示例中,我们将metadata设置为{'rowcount': 555},然后将其赋值给blob.metadata属性。这样就可以成功写入元数据了。

请注意,blob.metadata属性是一个字典,你可以根据需要添加其他属性。

总结

在Python的google_cloud_storage包中,要写入元数据,你需要将要保存的属性添加到blob.metadata属性中。只有这个属性可以被填充,其他属性会报错AttributeError: can't set attribute

正文完