在 DynamoDB 表中存储字典列表

use*_*406 3 python amazon-web-services elasticsearch amazon-dynamodb

我想在 DynamoDB 中存储 Elasticsearch 域的标签列表,但遇到一些错误。

我使用 list_tags() 函数获取标签列表: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/es.html#ElasticsearchService.Client.list_tags

response = client.list_tags(
    ARN='string'
)
Run Code Online (Sandbox Code Playgroud)

它返回:

{
    'TagList': [
        {
            'Key': 'string',
            'Value': 'string'
        },
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是他们在文档中所说的:响应结构

(dict) -- ListTags 操作的结果。包含所有请求的 Elasticsearch 域的标签。TagList (list) -- 请求的 Elasticsearch 域的标签列表。(dict) -- 指定资源标签的键值对。

现在我尝试使用各种方式在 DynamoDB 中插入列表,但我总是收到错误:

 ':TagList': {
                'M': response_list_tags['TagList']
            },
Run Code Online (Sandbox Code Playgroud)

参数 ExpressionAttributeValues.:TagList.M 的类型无效,值:[{'Key': 'Automation', 'Value': 'None'}, {'Key': 'Owner', 'Value': 'owner'}, {'Key': 'BU', 'Value': 'DS'}, {'Key': '支持', 'Value': 'teamA'}, {'Key': '注意', 'Value': ' '}, {'Key': '环境', 'Value': 'dev'}, {'Key': 'Creator', 'Value': ''}, {'Key': '子项目', 'Value' : ''}, {'Key': 'DateTimeTag', 'Value': 'nodef'}, {'Key': 'ApplicationCode', 'Value': ''}, {'Key': 'Criticity', ' Value': '3'}, {'Key': 'Name', 'Value': 'dev'}], 类型: , 有效类型: : ParamValidationError

尝试用 L 而不是 M 并得到这个:

ExpressionAttributeValues.:TagList.L[11] 中的未知参数:“值”,必须是以下之一:S、N、B、SS、NS、BS、M、L、NULL、BOOL:ParamValidationError

Mik*_*scu 6

您收到的具体错误是因为您使用的是本机 DynamoDB 文档项 JSON 格式,该格式要求任何属性值(包括映射中的键值,嵌套在列表中)完全限定为类型作为键值。

有两种方法可以做到这一点,从你的问题来看,我不确定你是否想要将这些键值标签对象存储为列表,或者你想要将其存储为 Dynamo 中的实际地图。

无论哪种方式,我建议您对列表进行 JSON 编码,并将其作为字符串值存储在 DynamoDB 中。没有真正充分的理由让您愿意经历将其存储为地图或列表的麻烦。

但是,如果您确实愿意,可以转换为 DynamoDB 本机 JSON 并存储为地图。你最终会得到这样的结果:

 ':TagList': {
      'M': {
         'Automation': { 'S': 'None' },
         'Owner': {'S': 'owner'},
         'BU': {'S': 'DS'},
         'Support': {'S': 'teamA'}
                ...  
      }
  }
Run Code Online (Sandbox Code Playgroud)

另一种可能性是使用地图列表:

  ':TagList': {
      'L': [
         'M': {'Key': {'S': 'Automation'}, 'Value': { 'S': 'None' }},
         'M': {'Key': {'S': 'Owner'}, 'Value' : {'S': 'owner'}},
         'M': {'Key': {'S': 'BU'}, 'Value': {'S': 'DS'}},
         'M': {'Key': {'S': 'Support'}, 'Value': {'S': 'teamA'}}
                ...  
      ]
  }
Run Code Online (Sandbox Code Playgroud)

但根据我的经验,我从未从在 Dynamo 中存储这样的数据中获得任何真正的价值。相反,将这些标签存储为 JSON 字符串既更容易,也更不容易出错。你最终会得到这样的结果:

  ':TagList': {
      'S': '{\'Key\': \'Automation\', \'Value\': \'None\'}, {\'Key\': \'Owner\', \'Value\': \'owner\'}, {\'Key\': \'BU\', \'Value\': \'DS\'}, {\'Key\': \'Support\', \'Value\': \'teamA\'}, ... }'
  }
Run Code Online (Sandbox Code Playgroud)

你所要做的就是扭动相当于:

 ':TagList': {
     'S': json.dumps(response_list_tags['TagList'])
 }
Run Code Online (Sandbox Code Playgroud)