从 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']
我是 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']