使用boto3扫描Dynamo DB以获取字典数组

时间:2019-06-11 15:32:35

标签: python-3.x amazon-web-services amazon-dynamodb boto3 botocore

需要扫描具有记录的字典对象列表的Dynamo DB。 以下是我的示例数据

'toAddr': [{'type': 'email', 'address': 'aaa@gmail.com'}, {'type': 'email', 'address': 'bbb@gmail.com'}]}

下面的代码行对我来说很有必要。

client = boto3.resource('dynamodb')
table = client.Table(table_name)
response = table.scan(FilterExpression="contains (#items, :itemVal)",
                      ExpressionAttributeNames={"#items": "toAddr"},
                      ExpressionAttributeValues={":itemVal":{"address":"aaa@gmail.com",
                                                              type":"email"}})

但是我想以以下格式构建过滤器表达式

response = table.scan(FilterExpression=Attr('toAddr').contains('itemVal'),
                      ExpressionAttributeValues={":itemVal":{"address":"aaa@gmail.com",
                                                    "type":"email"}}) 

但这会导致错误

  

botocore.exceptions.ClientError:调用扫描操作时发生错误(ValidationException):ExpressionAttributeValue中提供的值表达式中未使用的值:键:{:itemVal}

3 个答案:

答案 0 :(得分:2)

contains函数仅允许您搜索字符串中的字符串或集合中的字符串。您将需要重组数据,或者需要在python代码中过滤扫描结果。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html

答案 1 :(得分:1)

在第二个代码段中,'itemVal'只是一个字符串,与:itemVal中的ExpressionAttributeValues不匹配。按照您建议的格式,您可以摆脱ExpressionAttributeValues,而使用类似这样的方法:

itemVal = {"address": "aaa@gmail.com", "type": "email"}

response = table.scan(
    FilterExpression=Attr('toAddr').contains(json.dumps(itemVal))
) 

答案 2 :(得分:0)

@tommy,您的答案几乎是正确的,除了我们不应该使用json.dumps

<?php
header( 'Content-Type: application/pkcs7-mime' );
// Read the static file or just generate a dynamic content.
@readfile( __DIR__ . '/apple-app-site-association.json' );
exit;

以上内容有助于扫描结果。