Odczytując dokumentację, widzę, że istnieją trzy metody sprawdzania, czy istnieje tabela.
- 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
- 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.
- 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
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
@ anon58192932 wymyśliłeś, jak zaimportować ten wyjątek? Mam do czynienia z tym samym problemem. – Phito
@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