2017-02-27 69 views
8

Jestem nowym użytkownikiem w boto3 i używam DynamoDB.Jak sprawdzić, czy istnieje tabela DynamoDB?

Przeszedłem przez aplikację DynamoDB i nie mogłem znaleźć żadnej metody, która by mi podpowiedział, czy tabela już istnieje.

Jakie jest najlepsze podejście w tej kwestii?

Czy powinienem spróbować utworzyć nowy stół i zawinąć go za pomocą funkcji catch catch?

Odpowiedz

12

Odczytując dokumentację, widzę, że istnieją trzy metody sprawdzania, czy istnieje tabela.

  1. Urządzenie CreateTable API zgłasza błąd ResourceInUseException, jeśli tabela już istnieje. Owiń metodę create_table, spróbuj z wyjątkiem złapania tego
  2. Możesz użyć ListTables API, aby uzyskać listę nazw tabel powiązanych z bieżącym kontem i punktem końcowym. Sprawdź, czy nazwa tabeli znajduje się na liście nazw tabel otrzymanych w odpowiedzi.
  3. Jeśli zostanie wyświetlona nazwa tabeli, która nie istnieje, zostanie zgłoszony błąd ResourceNotFoundException.

Dla mnie pierwsza opcja brzmi lepiej, jeśli po prostu chcesz utworzyć tabelę.

Edytuj: Widzę, że niektórym osobom trudno jest wychwycić wyjątki. Podam poniżej kod, aby wiedzieć, jak radzić sobie z wyjątkami w boto3.

Przykład 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 

Przykład 2

import boto3 

dynamodb_client = boto3.client('dynamodb') 


table_name = 'test' 
existing_tables = 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, 
    ) 

Przykład 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 
3

Możesz użyć opisać tabelę API, aby ustalić, czy tabela istnieje.

Przykładowy kod:

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) 

Jeśli tabela istnieje: -

  • Dostaniesz odpowiedź

Jeśli tabela nie istnieje: -

  • Dostaniesz ResourceNotFoundException

    botocore.errorfactory.ResourceNotFoundException: Wystąpił błąd (ResourceNotF oundException) podczas wywoływania describeTable działanie: Nie można wykonać operacji na nieistniejącego tabeli

Inny sposób: -

Waits until this Table is exists. This method calls DynamoDB.Waiter.table_exists.wait() which polls. DynamoDB.Client.describe_table() every 20 seconds until a successful state is reached. An error is returned after 25 failed checks.

table.wait_until_exists() 
+3

Podoba mi się twój kod, ale nie mogę wymyślić, jak zaimportować 'botocore.errorfactory.ResourceNotFoundException'. Ciągle otrzymuję obiekt AttributeError: 'module' nie ma atrybutu 'ResourceNotFoundException''. Jestem zaimportowany 'boto3' i' botocore'. – anon58192932

+0

@ anon58192932 wymyśliłeś, jak zaimportować ten wyjątek? Mam do czynienia z tym samym problemem. – Phito

+1

@Phito przepraszam za opóźnienie Właśnie wróciłem do pracy. Proszę zobaczyć moją odpowiedź, że będę pisać, jak sprawdzić wyjątek. Nie można go zaimportować bezpośrednio, o ile rozumiem. – anon58192932

7
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) 
+1

Dziękuję za to! Traciłem to, co zostało z moich włosów. – mmr

2

Możesz użyć attr .table_status atra dowolnego obiektu instancji tabeli boto3. Zwraca status, jeśli istnieje (TWORZENIE, AKTUALIZACJA, USUWANIE, AKTYWNY) lub generuje wyjątek botocore.exceptions.ClientError: Requested resource not found: Table: <YOUR_TABLE_NAME> not found. Możesz zawinąć te warunki w try/except, z wyjątkiem pełnych informacji o bieżącym stanie tabeli.

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