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.
- 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 - 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.
- 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)