63 votes

Comment vérifier si une table DynamoDB existe ?

Je suis un nouvel utilisateur de boto3 et je me sers de DynamoDB .

J'ai parcouru l'API de DynamoDB et je n'ai trouvé aucune méthode permettant de savoir si une table existe déjà.

Quelle est la meilleure approche pour traiter cette question ?

Dois-je essayer de créer un nouveau tableau et l'envelopper en utilisant try catch ?

0 votes

Utiliser la fonction ensureTableExists de dynamodb-data-mapper check provides, pour créer une table si elle n'existe pas.

83voto

anupsabraham Points 1451

En lisant la documentation, je constate qu'il existe trois méthodes permettant de vérifier si une table existe.

  1. Le site API CreateTable lance une erreur ResourceInUseException si la table existe déjà. Enveloppez la méthode create_table avec try except pour attraper ceci
  2. Vous pouvez utiliser le API ListTables pour obtenir la liste des noms de table associés au compte et au point de terminaison actuels. Vérifiez si le nom de la table est présent dans la liste des noms de table que vous obtenez dans la réponse.
  3. Le site API DescribeTable entraînera une erreur ResourceNotFoundException si le nom de la table que vous demandez n'existe pas.

Pour moi, la première option semble meilleure si vous voulez simplement créer un tableau.

Edit : Je vois que certaines personnes ont du mal à saisir les exceptions. Je vais mettre un peu de code ci-dessous pour que vous sachiez comment gérer les exceptions dans boto3.

Exemple 1

import boto3

dynamodb_client = boto3.client('dynamodb')

try:
    response = dynamodb_client.create_table(
        AttributeDefinitions=[
            {
                'AttributeName': 'Artist',
                'AttributeType': 'S',
            },
            {
                'AttributeName': 'SongTitle',
                'AttributeType': 'S',
            },
        ],
        KeySchema=[
            {
                'AttributeName': 'Artist',
                'KeyType': 'HASH',
            },
            {
                'AttributeName': 'SongTitle',
                'KeyType': 'RANGE',
            },
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 5,
            'WriteCapacityUnits': 5,
        },
        TableName='test',
    )
except dynamodb_client.exceptions.ResourceInUseException:
    # do something here as you require
    pass

Exemple 2

import boto3

dynamodb_client = boto3.client('dynamodb')

table_name = 'test'
existing_tables = dynamodb_client.list_tables()['TableNames']

if table_name not in existing_tables:
    response = dynamodb_client.create_table(
        AttributeDefinitions=[
            {
                'AttributeName': 'Artist',
                'AttributeType': 'S',
            },
            {
                'AttributeName': 'SongTitle',
                'AttributeType': 'S',
            },
        ],
        KeySchema=[
            {
                'AttributeName': 'Artist',
                'KeyType': 'HASH',
            },
            {
                'AttributeName': 'SongTitle',
                'KeyType': 'RANGE',
            },
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 5,
            'WriteCapacityUnits': 5,
        },
        TableName=table_name,
    )

Exemple 3

import boto3

dynamodb_client = boto3.client('dynamodb')

try:
    response = dynamodb_client.describe_table(TableName='test')
except dynamodb_client.exceptions.ResourceNotFoundException:
    # do something here as you require
    pass

1 votes

Avec describe_table Je reçois AttributeError: 'dynamodb.ServiceResource' object has no attribute 'describe_table' .

8 votes

C'est parce que vous utilisez la ressource service au lieu du client. Vérifiez cette ligne dans votre code : dynamodb_client = boto3.client('dynamodb')

0 votes

L'exemple 3 est génial, mais j'obtenais une ClientError lancée : ``` dynamodb = boto3.resource(self._dynamodb_resource_name, region_name=self._region, endpoint_url=self. _endpoint_url) # Essayer de supprimer la table et ignorer si elle n'existe pas table = dynamodb.Table(self._tableName) try : table.delete() except ClientError as e : if e.response['Error']['Code'] != 'ResourceNotFoundException' : raise e ````

16voto

advocate Points 577
import boto3

from botocore.exceptions import ClientError

TABLE_NAME = "myTableName"
dynamodb = boto3.resource('dynamodb', endpoint_url="https://dynamodb.us-east-1.amazonaws.com")

table = dynamodb.Table(TABLE_NAME)

try:
    response = client.describe_table(TableName=TABLE_NAME)

except ClientError as ce:
if ce.response['Error']['Code'] == 'ResourceNotFoundException':
    print "Table " + TABLE_NAME + " does not exist. Create the table first and try again."
else:
    print "Unknown exception occurred while querying for the " + TABLE_NAME + " table. Printing full error:"
    pprint.pprint(ce.response)

3 votes

Merci pour cela ! Je perdais ce qui restait de mes cheveux.

0 votes

J'ai écrit ceci il y a 3 ans. Essayez d'obtenir un client de l'objet dynamodb objet. C'est ce que je pense pour l'instant.

10voto

ssc Points 1813

Approche alternative si vous ne voulez pas utiliser boto3.client mais seulement boto3.resource :

import boto3

database = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")    

table_name  = 'MyTable'
table_names = [table.name for table in database.tables.all()]

if table_name in table_names:
    print('table', table_name, 'exists')

7voto

notionquest Points 15321

Vous pouvez utiliser décrire la table API pour déterminer si la table existe.

Exemple de code :

from __future__ import print_function # Python 2/3 compatibility
import os
os.environ["TZ"] = "UTC"
import boto3

client = boto3.client('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000")

response = client.describe_table(
    TableName='Movies'
)    

print(response)

Si la table existe : -

  • Vous obtiendrez la réponse

Si la table n'existe pas:-

  • Vous obtiendrez ResourceNotFoundException

    botocore.errorfactory.ResourceNotFoundException : Une erreur s'est produite (ResourceNotF oundException) lors de l'appel de l'opération DescribeTable : Impossible d'effectuer des opérations sur une table inexistante

Une autre façon de faire:-

Attend que ce tableau existe. Cette méthode appelle DynamoDB.Waiter.table_exists.wait() qui interroge. DynamoDB.Client.describe_table() toutes les 20 secondes jusqu'à ce qu'une soit atteint. Une erreur est renvoyée après 25 échecs de vérification.

table.wait_until_exists()

6 votes

J'aime bien votre code mais je n'arrive pas à trouver comment importer le fichier botocore.errorfactory.ResourceNotFoundException . Je continue à obtenir AttributeError: 'module' object has no attribute 'ResourceNotFoundException' . Je suis importé boto3 y botocore .

0 votes

@anon58192932 avez-vous trouvé comment importer cette exception ? Je suis confronté au même problème.

1 votes

@Phito désolé pour le retard, je viens de reprendre le travail. Veuillez consulter ma réponse que je vais poster sur la façon de vérifier l'exception. Elle ne peut pas être importée directement d'après ce que j'ai compris.

6voto

juggernaut Points 139

Vous pouvez utiliser .table_status attr de tout objet de l'instance de la Table boto3. Il retourne son statut s'il existe (CREATING, UPDATING, DELETING, ACTIVE) ou lance une exception. botocore.exceptions.ClientError: Requested resource not found: Table: <YOUR_TABLE_NAME> not found . Vous pouvez envelopper ces conditions dans des try / except pour avoir des informations complètes sur l'état actuel de la table.

import boto3
from botocore.exceptions import ClientError

dynamodb = boto3.resource('dynamodb', region_name='us-west-2')
table = dynamodb.Table('your_table_name_str')

try:
  is_table_existing = table.table_status in ("CREATING", "UPDATING",
                                             "DELETING", "ACTIVE")
except ClientError:
  is_table_existing = False
  print "Table %s doesn't exist." % table.name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X