DynamoDB PutItem продолжает перезаписывать предыдущую запись - PullRequest
0 голосов
/ 07 августа 2020

Я хочу разместить заказ от моего lex-бота в DynamoDB, однако операция PutItem перезаписывается каждый раз (если имя клиента уже есть в таблице). Из документации я знаю, что он сделает это, если первичный ключ такой же.

Моя цель - поместить каждый заказ в базу данных, чтобы в будущем их можно было легко найти. Ниже я приложил несколько скриншотов. Любая помощь приветствуется

https://imgur.com/a/mLpEkOi

def putDynam(orderNum, table_custName, slotKey, slotVal):
    client = boto3.resource('dynamodb')
    table = client.Table('blah')
    
    input = {'Customer': table_custName, 'OrderNumber':orderNum[0], 'Bun Type': slotVal[5], 'CheeseDecision': slotVal[1], 'Cheese Type': slotVal[0], 'Pickles': slotVal[4], 'SauceDecision': slotVal[3], 'Sauce Type': slotVal[2]}
    
    action = table.put_item(Item=input)

Ответы [ 3 ]

1 голос
/ 07 августа 2020

Итак, по сути, имя клиента должно быть уникальным, поскольку это ваш первичный ключ. У вас не может быть двух строк с одним и тем же первичным ключом. Одним из способов может быть инкрементное значение, которое служит идентификатором, и каждая вставка будет просто иметь i + 1 в качестве идентификатора.

Вы можете увидеть этот вопрос о переполнении стека для получения дополнительной информации: { ссылка }

1 голос
/ 07 августа 2020

Для https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB .Client.put_item , вы можете:

"выполнить операцию условного размещения (добавить новый элемент, если элемент с указанным первичным ключом не существует) "

Примечание

Чтобы новый элемент не заменял существующий элемент, используйте условное выражение, которое содержит функцию attribute_not_exists с именем атрибута, используемого в качестве ключа раздела для таблицы. Поскольку каждая запись должна содержать этот атрибут, функция attribute_not_exists будет успешной только в том случае, если соответствующий элемент не существует.

Также см. DynamoDB: updateItem, только если он уже существует

Если вы действительно нужно знать, существует ли элемент или нет, чтобы вы могли вызвать свой журнал исключений c, а затем сначала запустить запрос, чтобы увидеть, существует ли элемент уже, и даже не вызывать put_item. Вы также можете изучить, может ли использование комбинации ConditionExpression и одного из параметров ReturnValues ​​(для put_item или update_item) вернуть достаточно данных, чтобы вы знали, существует ли элемент.

1 голос
/ 07 августа 2020

Первичный ключ используется для идентификации каждого элемента в таблице. Может быть только 1 запись с указанным c первичным ключом (первичные ключи уникальны).

Имя клиента не является хорошим первичным ключом, потому что оно не уникально.

В этом случае у вас может быть заказ с некоторым сгенерированным идентификатором (orderNumber в вашем примере?), который может быть первичным ключом, и Customer (предпочтительно CustomerId) в качестве свойства.

Или у вас может быть составной первичный ключ, состоящий из CustomerId и OrderId.

Если вы хотите запрашивать заказы от клиента, вы можете использовать индекс, если его нет в первичном ключе.

Я рекомендую вам сначала прочтите, как работает DynamoDB. Вы можете начать с этого руководства по моделированию данных из AWS.

...