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?
En lisant la documentation, je peux voir qu'il existe trois méthodes pour vérifier si un tableau existe.
ResourceInUseException
si la table existe déjà. Enveloppez la méthode create_table avec try sauf pour intercepter ceciResourceNotFoundException
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
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)
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: -
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()
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
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')