tables query example dynamodb python amazon-dynamodb boto3

query - python dynamodb



¿Cómo comprobar si existe la tabla de DynamoDB? (5)

Soy un usuario nuevo en boto3 y estoy usando DynamoDB .

Revisé la API de DynamoDB y no pude encontrar ningún método que me diga si ya existe una tabla.

¿Cuál es el mejor enfoque para tratar este problema?

¿Debo intentar crear una nueva tabla y envolverla utilizando try catch?


Al leer la documentación, puedo ver que hay tres métodos para verificar si existe una tabla.

  1. La API CreateTable genera una excepción ResourceInUseException error si la tabla ya existe. Envuelve el método create_table con try excepto para capturar esto
  2. Puede usar la API ListTables para obtener la lista de nombres de tablas asociados con la cuenta actual y el punto final. Verifique si el nombre de la tabla está presente en la lista de nombres de tabla que obtiene en la respuesta.
  3. La API DescribeTable arrojará un error ResourceNotFoundException si el nombre de la tabla que solicita no existe.

Para mí, la primera opción suena mejor si solo desea crear una tabla.

Edit: veo que a algunas personas les resulta difícil atrapar las excepciones. A continuación, pondré un código para que sepa cómo manejar las excepciones en boto3.

Ejemplo 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

Ejemplo 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, )

Ejemplo 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


Enfoque alternativo si no desea usar boto3.client sino solo 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'')


Puede usar el atributo .table_status de cualquier objeto de instancia de tabla boto3. Devuelve su estado si existe (CREANDO, ACTUALIZANDO, BORRANDO, ACTIVO) o lanza la excepción botocore.exceptions.ClientError: Requested resource not found: Table: <YOUR_TABLE_NAME> not found . Puede ajustar esas condiciones en try / except para tener información completa sobre el estado de la tabla actual.

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


Puede usar la API de tabla de descripción para determinar si la tabla existe.

Código de muestra:

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 tabla existe: -

  • Obtendrás la respuesta

Si la tabla no existe: -

  • Obtendrá ResourceNotFoundException

    botocore.errorfactory.ResourceNotFoundException: se produjo un error (ResourceNotF oundException) al llamar a la operación DescribeTable: no se pueden realizar operaciones en una tabla que no existe

De otra manera:-

Espera hasta que exista esta tabla. Este método llama a DynamoDB.Waiter.table_exists.wait () que sondea. DynamoDB.Client.describe_table () cada 20 segundos hasta que se alcanza un estado exitoso. Se devuelve un error después de 25 comprobaciones fallidas.

table.wait_until_exists()


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)