web-dev-qa-db-fra.com

Créer un conteneur d'objets blob dans le stockage Azure s'il n'existe pas

J'essaie de créer un conteneur d'objets blob dans le stockage Azure en python. J'utilise la documentation fournie par MSDN pour intégrer le stockage d'objets blob Azure dans mon programme python.

Voici le code:

# Quick start code goes here
connectStr = <connString>
blobServiceClient = BlobServiceClient.from_connection_string(connectStr)
containerName = "quickstart-azureStorage"
localFileName = "quickstart-1.txt"
blobClient = blobServiceClient.create_container(containerName)

create_container() crée un conteneur d'objets blob pour la première fois, mais cela me donne une erreur une deuxième fois.

Je souhaite créer un conteneur d'objets blob s'il n'existe pas. S'il existe, utilisez le conteneur d'objets blob existant

J'utilise la bibliothèque de stockage Azure version 12.0.0. c'est-à-dire Azure-storage-blob==12.0.0

Je sais que nous pouvons le faire pour le blob présent dans ce conteneur en utilisant le code ci-dessous, mais je n'ai rien trouvé pour créer le conteneur lui-même.

Vérifiez que le blob existe ou non:

blobClient = blobServiceClient.get_blob_client(container=containerName, blob=localFileName)
if blobClient:
    print("blob already exists")
else:
     print("blob not exists")

Exception:

RequestId:<requestId>
Time:2019-12-04T06:59:03.1459600Z
ErrorCode:ContainerAlreadyExists
Error:None
5
Prasad Telkikar

Avec la version 12.0.0 de la bibliothèque, une solution possible est d'utiliser la fonction get_container_properties (), qui provoquera une erreur si le conteneur n'existe pas:

container = ContainerClient.from_connection_string(connectStr, 'foo')

try:
    container_properties = container.get_container_properties()
    # Container foo exists. You can now use it.

except Exception as e:
    # Container foo does not exist. You can now create it.
    print(e)

Si le conteneur n'existe pas, vous verrez le message suivant:

Le conteneur spécifié n'existe pas.

ErrorCode: ContainerNotFound

Erreur: aucune

2

Je vous pourrais accepter le sdk de stockage de version basse, vous pouvez essayer le Azure-storage-blob==2.1.0, il existe une méthode exists pour vérifier si l'objet blob ou le conteneur existe. S'il existe, il retournera vrai ou faux.

enter image description here

Après la méthode exists, créez le conteneur si elle renvoie false, si return true, utilisez simplement le conteneur.

1
George Chen

Si vous regardez la documentation pour create_container , elle indique que:

Crée un nouveau conteneur sous le compte spécifié. Si le conteneur du même nom existe déjà, l'opération échoue.

Une solution possible pour surmonter ce problème consiste à créer le conteneur et à détecter l'erreur. Si le conteneur existe déjà, vous obtiendrez un code d'erreur Conflict (409). Sur cette base, vous pouvez déterminer si le conteneur existe ou non.

Si la rétrogradation du SDK est une option, vous pouvez utiliser version 2.1 Of Python SDK de stockage. Là, le comportement par défaut est de ne pas lever d'exception si le conteneur existe. Vous pouvez voir le code pour create_container ici: https://github.com/Azure/azure-storage-python/blob/master/Azure-storage-blob/Azure/storage/blob/baseblobservice.py .

1
Gaurav Mantri

Similaire à @ Paolo's excellente réponse, vous pouvez envelopper votre code dans un try..catch et attrapez le Azure.core.exceptions.ResourceExistsError exception si la ressource conteneur existe déjà.

La différence ici est que j'attrape l'exception spécifique soulevée, et la réponse de @ Paolo attrape Exception , qui est la classe de base pour toutes les exceptions. Je trouve plus clair d'attraper l'exception spécifique dans ce cas, car elle est plus distincte avec l'erreur que j'essaie de gérer.

De plus, si le conteneur n'existe pas, alors Azure.storage.blob.BlobServiceClient.create_container créera la ressource conteneur.

from Azure.core.exceptions import ResourceExistsError

blob_service_client = BlobServiceClient.from_connection_string(connection_string)

try:
    # Attempt to create container
    blob_service_client.create_container(container_name)

# Catch exception and print error
except ResourceExistsError as error:
    print(error)

# Do something with container

Ce qui imprimera cette erreur à partir de l'exception:

The specified container already exists.
RequestId:5b70c1d8-701e-0028-3397-3c77d8000000
Time:2020-06-07T06:46:15.1526773Z
ErrorCode:ContainerAlreadyExists
Error:Non

Nous pourrions également ignorer complètement l'exception avec instruction pass :

try:
    # Attempt to create container
    blob_service_client.create_container(container_name)

# Catch exception and ignore it completely
except ResourceExistsError:
    pass
0
RoadRunner