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 个函数。

在我的 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 作为查询字符串参数。