【问题标题】:Python Azure SDK how to get a previous version of a blobPython Azure SDK 如何获取以前版本的 blob
【发布时间】:2021-12-29 17:36:30
【问题描述】:

我目前正在使用带有 azure.storage.blob 12.9.0 版和 azure.core 1.14.0 版的 python v3.8.8。

我想使用 azure 中的 python SDK 来控制 blob 版本控制。理想情况下,我希望为给定的 BlobClient 提供以下 2 个函数。

  • 通过指定的 versionId 获取 blob 的版本。
  • 将此 blob 的版本设置为 blob 的“当前版本”。

在我的 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。然后我用follow上传了一个新版本。

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 仍然为 true。在 azure 门户上,我可以看到有一个以前的版本。我可以使用以下代码使用 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}')

关于here 的类似问题已发布,但不适用于 python。此外,如果需要,我希望将 blob 恢复为以前的 id(我知道这可以使用指南 here 在 azure 门户中完成)。

我尝试在 blob 名称中使用参数 versionId,如下所示。

blob_client = container_client.get_blob_client(my_blob_name + '?versionId=' + old_version_id)

查看文档here 没有版本ID 的关键字。虽然我确实尝试过,但得到了一个不足为奇的错误。

任何帮助将不胜感激,或者只是知道此功能不可用也是有用的。

【问题讨论】:

    标签: python azure version-control azure-sdk-python


    【解决方案1】:

    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 的 URL 相同,但使用 versionId 作为查询字符串参数。

    【讨论】:

    • 感谢 Gaurav,这非常适合获取不同版本的 blob。我想知道你是否知道如何做我问题的第二部分。要通过 SDK 更改哪个版本是当前版本?
    • 用你的第二个问题的答案更新了我的答案。 HTH。
    • 谢谢,效果很好。遗憾的是,它必须存储同一版本的多个副本……如果您可以切换哪个版本是活动版本,那就太好了。不想删除旧副本,因为它全部记录下来很有用...
    • 抱歉,我认为 azure 确实使用 copy 属性做到了这一点。
    • 当您覆盖 blob(甚至通过副本)时,将创建一个新版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2010-12-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多