Как включить неключевые атрибуты в таблицу DynamodB и присвоить ей значения с помощью batch_writer? - PullRequest
1 голос
/ 06 ноября 2019

Создание таблицы с использованием DynamodB с хэш-ключами и ключами Range. Кроме того, у меня есть некоторые неключевые атрибуты, и их значения должны быть включены в него. Ошибка при попытке обновить таблицу.

Код:

dynamodb = boto3.resource('dynamodb')
client = boto3.client('dynamodb')

table = dynamodb.Table('Name')
db_AccountNumber=[]  #data to be included in table is in below two lists which consists of multiple 12 digit AWS account-ID's.

db_accountalias=[]  #data contains multiple AWS account-names

# Create the DynamoDB table.
table = dynamodb.create_table(
    TableName='Name',
    KeySchema=[
        {
            'AttributeName': 'account_number',
            'KeyType': 'HASH'
        },
        {
            'AttributeName': 'account_type',
            'KeyType': 'RANGE'
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'account_number',
            'AttributeType': 'S'
        },
        {
            'AttributeName': 'account_type',
            'AttributeType': 'S'
        },
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 10,
        'WriteCapacityUnits': 10,
    }
)

table.meta.client.get_waiter('table_exists').wait(TableName='Name')


with table.batch_writer() as batch:
    for item in db_AccountNumber:
        for alias in db_accountalias:
            batch.put_item(
                Item={
                     'account_number' : item,
                     'account_type' : 'new',
                     'iam_alias': {'S': alias},
                     'profile': {'S': alias},
                     'cname': {'S': alias}
            }
     )

Я хочу, чтобы неключевые атрибуты iam_alias, profile, cname имели те же значения, что иof.

Выполнение вышеуказанных кодов дает ошибку:

Traceback (most recent call last):
  File "./createdb_multiplefields.py", line 66, in <module>
    'cname': {'S': alias}
  File "/usr/lib/python2.7/site-packages/boto3/dynamodb/table.py", line 101, in put_item
    self._add_request_and_process({'PutRequest': {'Item': Item}})
  File "/usr/lib/python2.7/site-packages/boto3/dynamodb/table.py", line 110, in _add_request_and_process
    self._flush_if_needed()
  File "/usr/lib/python2.7/site-packages/boto3/dynamodb/table.py", line 131, in _flush_if_needed
    self._flush()
  File "/usr/lib/python2.7/site-packages/boto3/dynamodb/table.py", line 137, in _flush
    RequestItems={self._table_name: items_to_send})
  File "/usr/lib/python2.7/site-packages/botocore/client.py", line 357, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/lib/python2.7/site-packages/botocore/client.py", line 661, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the BatchWriteItem operation: Provided list of item keys contains duplicates

Очевидно, что ключи в моем Предмете не являются дубликатами. Как исправить эту ошибку и обновить таблицу?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Выяснил, как вводить данные в таблицу. Я заменил два оператора цикла for for item in db_AccountNumber:<br> for alias in db_accountalias: только одним оператором цикла, как показано ниже.

for item, alias in zip(db_AccountNumber, db_accountalias):, который добился цели.

0 голосов
/ 06 ноября 2019

В сообщении об ошибке говорится, что у вас есть дубликаты ключей. Ваша проблема в этом фрагменте кода:

with table.batch_writer() as batch:
    for item in db_AccountNumber:
        for alias in db_accountalias:
            batch.put_item(
                Item={
                     'account_number' : item,
                     'account_type' : 'new',
                     'iam_alias': {'S': alias},
                     'profile': {'S': alias},
                     'cname': {'S': alias}
            }
     )

При первом выполнении внутреннего цикла for alias in db_accountalias: ваш account_number установлен в значение item, а account_type установлен в 'new'. При втором выполнении того же цикла для account_number все еще устанавливается значение item (поскольку вы все еще находитесь в контексте внутреннего цикла), и аналогично account_type также все еще устанавливается на 'new', так какэто постоянное значение, которое не меняется при повторении внутреннего цикла. В результате вы получаете двойное значение ключа, которое указывает сообщение об ошибке.

...