Boto3 DynamoDB ParamValidationError При вставке вложенных объектов - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь поместить (вставить) вложенный объект в мою таблицу DynamoDB. Объект, который я построил в соответствии с документацией boto3:

itm = {
    'uid': {
        'S': 'some-unique-id-value'
    },
    'myArray': {
        'L': [
            {
                'propOne': {
                    'S': 'this is value of prop 1'
                },
                'createdOn': {
                    'S': str(time.time())
                },
                'isActive': {
                    'BOOL': True
                },
                'propTwo': {
                    'S': 'this is value of prop 2'
                },
                'propThree': {
                    'S': 'this is value of prop 3'
                }
            }
        ]
    }
}

И затем я помещаю элемент, используя DynamoDB client:

dynamodb.put_item(TableName='myTableName', Item=itm)

Но я получаю исключение:

botocore.exceptions.ParamValidationError: Parameter validation failed:
Unknown parameter in Item.myArray.L[0]: "propOne", must be one of: S, N, B, SS, NS, BS, M, L, NULL, BOOL
Unknown parameter in Item.myArray.L[0]: "createdOn", must be one of: S, N, B, SS, NS, BS, M, L, NULL, BOOL
Unknown parameter in Item.myArray.L[0]: "isActive", must be one of: S, N, B, SS, NS, BS, M, L, NULL, BOOL
Unknown parameter in Item.myArray.L[0]: "propTwo", must be one of: S, N, B, SS, NS, BS, M, L, NULL, BOOL
Unknown parameter in Item.myArray.L[0]: "propThree", must be one of: S, N, B, SS, NS, BS, M, L, NULL, BOOL

Я следую этой документации:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.put_item

Моя цель - сохранить элемент, как показано в этом объекте JSON:

{
   "uid":"some-uid-val",
   "myArray":[
      {
         "propOne":"item 1 prop 1 value",
         "createdOn":"123456",
         "isActive":true,
         "propTwo":"item 1 prop 2 value",
         "propThree":"item 1 prop 3 value"
      },
      {
         "propOne":"item 2 prop 1 value",
         "createdOn":"123456",
         "isActive":true,
         "propTwo":"item 2 prop 2 value",
         "propThree":"item 2 prop 3 value"
      }
   ]
}

Что я делаю не так?

1 Ответ

0 голосов
/ 27 октября 2019

Когда вы помещаете массив,

'L': [
                {'... recursive ...'},
            ],

требуется рекурсивная структура элемента. Так как у вас есть dict тип элементов списка, у вас есть вложенные объекты dict в списке. Тогда ваш товар должен выглядеть следующим образом:

itm = {
    'uid': {
        'S': 'some-unique-id-value'
    },
    'myArray': {
        'L': [
            'M': {
                'propOne': {
                    'S': 'this is value of prop 1'
                }
            },
            'M': {
            'createdOn': {
                    'S': str(time.time())
                }
            },
            'M': {
                'isActive': {
                    'BOOL': True
                }
            },
            'M': {
                'propTwo': {
                    'S': 'this is value of prop 2'
                }
            },
            'M': {
                'propThree': {
                    'S': 'this is value of prop 3'
                }
            }
        ]
    }
}
...