Создание нового элемента в таблице DynamoDB с использованием Boto3 не соответствует схеме таблицы - PullRequest
0 голосов
/ 14 апреля 2020

Примечание также размещено на github boto3 https://github.com/boto/boto3/issues/2383

Я пытаюсь добавить элемент в таблицу Dynamo, используя Boto3. Хотя я могу успешно добавить элемент в таблицу, используя «table.put_item», но новая запись не соответствует схеме. Например, чтобы успешно добавить элемент, я должен предоставить «идентификатор», хотя схема указывает, что идентификатор должен генерироваться DynamoDB напрямую. Кроме того, некоторые элементы новой записи должны быть сопоставлены с выборками из перечислений, но вместо этого хранятся в виде строк.

Мой вопрос заключается в том, могу ли я заставить Boto3 применять те же ограничения при создании нового объекта, как и из используя GraphQl / Amplify?

Следуйте псевдо-схеме и коду.

Pseudo Schema

type User @model {
  id: ID!
  xxxxxx1: String!
  xxxxxx2: [Choice1!]
  xxxxxx3: Float!
}

enum Choice1 {
  A
  b
}

Pseudo code (python)
import json
import uuid  
import boto3
from decimal import Decimal
session     = boto3.Session (profile_name= 'botoUser')
credentials = session.get_credentials ()
credentials = credentials.get_frozen_credentials()
access_key  = credentials.access_key
secret_key  = credentials.secret_key
token       = credentials.token
table_name  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-dev'
dynamodb    = boto3.resource('dynamodb', 
                             region_name='us-east-1',
                             aws_access_key_id=access_key,
                             aws_secret_access_key=secret_key,
                             aws_session_token=token)
table        = dynamodb.Table(table_name)
item         = {xxxxxx1: 'name', xxxxxx2: 'A', 'xxxxxx3': 1.0}
item_json    = json.dumps (item)
item_obj     = json.loads (item_json, parse_float=Decimal)
item_obj[id] = str (uuid.uuid4())
table.put_item (
    Item=item_obj
)

Results in the DB (from the Amplify Console)
id: guid as a string as provided in the update
xxxxxx1: 'name'
xxxxxx2: 'A' (not a selection from Choice1)
xxxxxx3: 1.0

Additionally __typename and createdAt are not set for the new item.
...
...