Python Azure SDK 如何获取以前版本的 blob
Python Azure SDK how to get a previous version of a blob
我目前正在使用 python v3.8.8 和 azure.storage.blob 的 12.9.0 版和 azure.core 的 1.14.0 版。
我想在 azure 中使用 python SDK 来控制 blob 版本控制。理想情况下,我希望给定的 BlobClient 有以下 2 个函数。
- 通过指定的 versionId 获取 blob 的版本。
- 将此 blob 的版本设置为 blob 的 'current version'。
在我的 Azure 帐户中,我已经激活了版本控制。这是我目前的设置。
from azure.storage.blob import ContainerClient
container_client = ContainerClient(
my_account_name,
my_container_name,
credential = my_credentials
)
container_client.upload_blob(my_blob_name, dummy_data)
blob_client = container_client.get_blob_client(my_blob_name)
blob_properties = blob_client.get_blob_properties()
for key, value in blob_properties.__dict__.items():
print(f'{key}: {value}')
查看 blob 属性时,我可以看到 version_id 是这个时间戳,is_current_version 是 True。然后我使用以下方法上传了一个新版本。
blob_client.upload_blob(edited_dummy_data, overwrite=True)
blob_properties = blob_client.get_blob_properties()
for key, value in blob_properties.__dict__.items():
print(f'{key}: {value}')
那么版本ID变了,is_current_version依然如此。在 azure portal 上我可以看到有一个以前的版本。我可以使用以下代码使用 python SDK 列出这些版本。
blob_list = container_client.list_blobs(name_starts_with = my_blob_name, include = ['versions'])
for blob_property in blob_list:
print(blob_property.name, blob_property.version_id)
然而,当尝试使用以下方法访问不同版本的 blob 时,我只返回了 blob 的当前版本。
blob_list = container_client.list_blobs(name_starts_with = my_blob_name, include = ['versions'])
for blob_property in blob_list:
blob_client = container_client.get_blob_client(blob_property)
blob_properties = blob_client.get_blob_properties()
for key, value in blob_properties.__dict__.items():
print(f'{key}: {value}')
有人发布了关于此 but not for python. Moreover I would like revert a blob to a previous id if required (I know this can be done in the azure portal using the guide here) 的类似问题。
我试过在 blob 的名称中使用参数 versionId,如下所示。
blob_client = container_client.get_blob_client(my_blob_name + '?versionId=' + old_version_id)
查看文档 here 版本 ID 没有关键字。虽然我确实尝试过,但得到了一个不足为奇的错误。
任何帮助将不胜感激,或者仅仅知道此功能不可用也会很有用。
get_blob_properties
方法接受 version_id
参数,因此您需要做的是在获取版本化 blob 的属性时提供该参数。
基本上您需要更改以下代码行:
blob_properties = blob_client.get_blob_properties()
至
blob_properties = blob_client.get_blob_properties(version_id='blob version id')
更新
要用其版本之一覆盖基本 blob,您只需在 blob 客户端上使用 start_copy_from_url
方法并向其提供版本化 blob 的 URL。版本化 blob 的 URL 将与基本 blob 的相同,但使用 versionId
作为查询字符串参数。
我目前正在使用 python v3.8.8 和 azure.storage.blob 的 12.9.0 版和 azure.core 的 1.14.0 版。
我想在 azure 中使用 python SDK 来控制 blob 版本控制。理想情况下,我希望给定的 BlobClient 有以下 2 个函数。
- 通过指定的 versionId 获取 blob 的版本。
- 将此 blob 的版本设置为 blob 的 'current version'。
在我的 Azure 帐户中,我已经激活了版本控制。这是我目前的设置。
from azure.storage.blob import ContainerClient
container_client = ContainerClient(
my_account_name,
my_container_name,
credential = my_credentials
)
container_client.upload_blob(my_blob_name, dummy_data)
blob_client = container_client.get_blob_client(my_blob_name)
blob_properties = blob_client.get_blob_properties()
for key, value in blob_properties.__dict__.items():
print(f'{key}: {value}')
查看 blob 属性时,我可以看到 version_id 是这个时间戳,is_current_version 是 True。然后我使用以下方法上传了一个新版本。
blob_client.upload_blob(edited_dummy_data, overwrite=True)
blob_properties = blob_client.get_blob_properties()
for key, value in blob_properties.__dict__.items():
print(f'{key}: {value}')
那么版本ID变了,is_current_version依然如此。在 azure portal 上我可以看到有一个以前的版本。我可以使用以下代码使用 python SDK 列出这些版本。
blob_list = container_client.list_blobs(name_starts_with = my_blob_name, include = ['versions'])
for blob_property in blob_list:
print(blob_property.name, blob_property.version_id)
然而,当尝试使用以下方法访问不同版本的 blob 时,我只返回了 blob 的当前版本。
blob_list = container_client.list_blobs(name_starts_with = my_blob_name, include = ['versions'])
for blob_property in blob_list:
blob_client = container_client.get_blob_client(blob_property)
blob_properties = blob_client.get_blob_properties()
for key, value in blob_properties.__dict__.items():
print(f'{key}: {value}')
有人发布了关于此
我试过在 blob 的名称中使用参数 versionId,如下所示。
blob_client = container_client.get_blob_client(my_blob_name + '?versionId=' + old_version_id)
查看文档 here 版本 ID 没有关键字。虽然我确实尝试过,但得到了一个不足为奇的错误。
任何帮助将不胜感激,或者仅仅知道此功能不可用也会很有用。
get_blob_properties
方法接受 version_id
参数,因此您需要做的是在获取版本化 blob 的属性时提供该参数。
基本上您需要更改以下代码行:
blob_properties = blob_client.get_blob_properties()
至
blob_properties = blob_client.get_blob_properties(version_id='blob version id')
更新
要用其版本之一覆盖基本 blob,您只需在 blob 客户端上使用 start_copy_from_url
方法并向其提供版本化 blob 的 URL。版本化 blob 的 URL 将与基本 blob 的相同,但使用 versionId
作为查询字符串参数。