web-dev-qa-db-ja.com

DynamoDBテーブルが存在するかどうかを確認する方法は?

私はboto3の新しいユーザーであり、DynamoDBを使用しています。

DynamoDB apiを調べたところ、テーブルが既に存在するかどうかを確認する方法が見つかりませんでした。

この問題に対処する最良の方法は何ですか?

新しいテーブルを作成して、try catchを使用してラップする必要がありますか?

31
roeygol

ドキュメントを読むと、テーブルが存在するかどうかを確認できる3つの方法があることがわかります。

  1. CreateTable API は、テーブルが既に存在する場合、エラーResourceInUseExceptionをスローします。これをキャッチする以外は、create_tableメソッドをtryでラップします
  2. ListTables API を使用して、現在のアカウントとエンドポイントに関連付けられたテーブル名のリストを取得できます。応答で取得するテーブル名のリストにテーブル名が存在するかどうかを確認します。
  3. DescribeTable API は、要求したテーブル名が存在しない場合にエラーResourceNotFoundExceptionをスローします。

私にとっては、テーブルを作成したいだけであれば、最初のオプションの方がいいですね。

編集:一部の人々は例外をキャッチするのが難しいと感じているようです。 boto3で例外を処理する方法を知るために、以下にいくつかのコードを配置します。

例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

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

例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

describe table APIを使用して、テーブルが存在するかどうかを判断できます。

サンプルコード:

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)

テーブルが存在する場合:-

  • あなたは応答を得ます

テーブルが存在しない場合:-

  • ResourceNotFoundExceptionを取得します

    botocore.errorfactory.ResourceNotFoundException:DescribeTable操作を呼び出すときにエラーが発生しました(ResourceNotF oundException):存在しないテーブルで操作を実行できません

別の方法:-

このテーブルが存在するまで待機します。このメソッドは、ポーリングするDynamoDB.Waiter.table_exists.wait()を呼び出します。 DynamoDB.Client.describe_table()は、成功状態に達するまで20秒ごとに。チェックに25回失敗すると、エラーが返されます。

table.wait_until_exists()
4
notionquest

Boto3テーブルインスタンスオブジェクトの 。table_status attrを使用できます。ステータスが存在する場合(CREATING、UPDATING、DELETING、ACTIVE)を返すか、例外botocore.exceptions.ClientError: Requested resource not found: Table: <YOUR_TABLE_NAME> not foundをスローします。これらの条件をtry /にラップして、現在のテーブルの状態に関する完全な情報を得ることができます。

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

boto3.client ではなく、 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