从 dynamo 数据库获取属性 table

Get attribute from dynamo db table

我是 pyton 和 lambda 脚本的新手。我试图从仅具有主分区键的 dynamodb table 的“扩展”属性中获取值。

from __future__ import print_function
import boto3
from boto3.dynamodb.conditions import Key, Attr
import json
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
    #print(event)
    extension=event['Details']['ContactData']['Attributes'].get('AgentExtension',"Not Available")
    table = dynamodb.Table('mm-vm-solution-VoicemailStack-1BCDEMP76ZZA6-UsersTable-YYZ15DDH1LHR')
    try:
      response = table.query(
        IndexName= 'AgentExtensionIndex',
        KeyConditionExpression=Key('extension').eq(extension)
        )
    except ClientError as e:
        print(e.response['Error']['Message'])
        return {
                "Success":"False",
                "Reason":e.response['Error']['Message']
               }
    else:
        #item = response['Items']
        print("GetItem succeeded:")
        print(json.dumps(response))
        if "Item" in response:
            return {
                "Success":"True"
            }
        else:
            return {
                "Success":"False",
                "Reason":"No Records Found"
            }

Dynamo db table 由主分区键“agentId (String)”组成。 GSI 已启用,如下面的屏幕截图所示。

Dynamo db table

****更新**** 我可以通过最后一部分检索“成功”:“真”:

 else:
        #item = response['Item']
        print("GetItem succeeded:")
        print(json.dumps(response))
        print(response['Items'])
        if "Items" in response:
            return{
                "Success":"True",
                "Extension":response["Items"][{extension}]
                }

正在给我打印这个:

    {
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      30,
      "lambda_handler",
      "\"Extension\":response[\"Items\"][{extension}]"
    ]
  ],
  "errorType": "TypeError",
  "errorMessage": "list indices must be integers, not set"
}

我只需要这个输出:

"Success":"True"
"Extension:"7777"

请帮我实现这个,我会将答案标记为正确!

为了仅从 Dynamo 获取某些属性,我们需要使用 ProjectionExpression,并将属性映射到 ExpressionAttributeNames

中的表达式

可能看起来像这样。

table = dynamodb.Table('test-table')
response = table.get_item(
        Key={'agentId': "agent1"},
        ExpressionAttributeNames={
                '#name': 'name'
        },
        ProjectionExpression= '#name'
)

更新:要仅通过没有主键的属性进行查询,我们需要创建一个 GSI 并使用该索引进行查询。 在这种情况下,partitionKey 是 name,索引名称是 by-name-index

并使用query通过GSI

获取数据
import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb',region_name='us-east-1')
table = dynamodb.Table('test-table')
response = table.query(
        IndexName= 'by-name-index',
        KeyConditionExpression=Key('name').eq("john")
)
print(response['Items'])

对 DynamoDB 的响应 DocumentClient query 不包含单个项目。它包含一个项目列表。

您正在测试:

if 'Item' in response:

你应该测试:

if 'Items' in response:

请注意,多个项目可能与查询匹配,因此请准备好处理响应中的多个项目。如果您只是想检索一个属性值,例如extension,从第一个结果开始,你可以这样做:

response["Items"][0]['extension']