web-dev-qa-db-fra.com

Comment vérifier si la table DynamoDB existe?

Je suis un nouvel utilisateur de boto3 et j'utilise DynamoDB.

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

Quelle est la meilleure approche face à ce problème?

Devrais-je essayer de créer une nouvelle table et l'envelopper à l'aide de try catch?

31
roeygol

En lisant la documentation, je peux voir qu'il existe trois méthodes pour vérifier si un tableau existe.

  1. API CreateTable génère une erreur ResourceInUseException si la table existe déjà. Enveloppez la méthode create_table avec try sauf pour intercepter ceci
  2. Vous pouvez utiliser ListTables API pour obtenir la liste des noms de table associés au compte actuel et au noeud final. Vérifiez si le nom de la table est présent dans la liste des noms de tables que vous obtenez dans la réponse.
  3. Le DescribeTable API émettra une erreur ResourceNotFoundException si le nom de la table que vous demandez n'existe pas.

Pour moi, la première option sonne mieux si vous voulez juste créer un tableau.

Edit: Je vois que certaines personnes ont du mal à saisir les exceptions. Je vais mettre du 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
43
anupsabraham
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)
10
anon58192932

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 non existante

autre moyen: -

Attend que cette table existe. Cette méthode appelle DynamoDB.Waiter.table_exists.wait () qui interroge. DynamoDB.Client.describe_table () toutes les 20 secondes jusqu'à ce qu'un état réussi soit atteint. Une erreur est renvoyée après 25 contrôles infructueux.

table.wait_until_exists()
4
notionquest

Vous pouvez utiliser . Table_status attr de tout objet d'instance de table boto3. Il retourne son statut s'il existe (CREATING, UPDATING, DELETING, ACTIVE) ou déclenche une exception botocore.exceptions.ClientError: Requested resource not found: Table: <YOUR_TABLE_NAME> not found. Vous pouvez inclure ces conditions dans try/sauf 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
2
juggernaut

Autre approche 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')
2
ssc