私はboto3の新しいユーザーであり、DynamoDB
を使用しています。
DynamoDB apiを調べたところ、テーブルが既に存在するかどうかを確認する方法が見つかりませんでした。
この問題に対処する最良の方法は何ですか?
新しいテーブルを作成して、try catchを使用してラップする必要がありますか?
ドキュメントを読むと、テーブルが存在するかどうかを確認できる3つの方法があることがわかります。
ResourceInUseException
をスローします。これをキャッチする以外は、create_tableメソッドをtryでラップします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
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)
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()
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
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')