AWS Boto3 Dynamodb查询问题

时间:2017-01-01 20:39:12

标签: python amazon-web-services amazon-dynamodb boto3

我在为AWS Dynamodb定义查询表达式时遇到问题。 目标是获得具有字段timeStamp的唯一dynamodb记录,该字段包含字符串" 1475413345"。我已经确认可以使用相同的字符串通过AWS Web控制台检索此内容。

我怀疑我的.contains语法有问题。

非常感谢任何帮助!

以下是代码:

import boto3
from boto3.dynamodb.conditions import Key, Attr

from time import sleep

benchtemp = boto3.resource('dynamodb')  # if set in ~/.boto
table = benchtemp.Table('benchtemp')

temps = table.query(
    KeyConditionExpression=Key('timeStamp').contains('1475413345')
)


for temp in temps:
    print temp;
    time.sleep(1)

以下是我收到的错误消息:

Traceback (most recent call last):
  File "/Users/neal/PycharmProjects/Read-NMT-DB/Read-NMT-DB.py", line 15, in <module>
    KeyConditionExpression=Key('timeStamp').contains('1475413345')
AttributeError: 'Key' object has no attribute 'contains'

Process finished with exit code 1

2 个答案:

答案 0 :(得分:1)

KeyConditionExpressions可能只限制表/索引的主(分区和排序)键。如果timeStamp不是主键,则可以使用FilterExpression过滤掉与您要查找的时间戳前缀不匹配的键。

答案 1 :(得分:0)

尝试这样编写查询:

temps = table.query(
            TableName=table,
            ExpressionAttributeNames='#tS = timeStamp'
            KeyConditionExpression='#tS = :recordTimeStamp',
            ExpressionAttributeValues={":recordTimeStamp": Decimal(1475413345)}
        )

请注意,由于“ timeStamp”是保留字,因此需要ExpressionAttributeNames。有关此信息,请参见here

如果将timeStamp作为数字记录在数据库中,请使用Decimal。要使用十进制,请导入:

from decimal import *

如果将timeStamp记录为字符串,请使用str(1475413345)而不是Decimal(1475413345)。

正如亚历山大所说,确保timeStamp是您的分区键。如果不是,则更改表结构使其为原来的状态,或使用过滤器表达式。您只能使用分区进行排序或仅使用分区键进行查询。

例如,如果userId是您的分区键,并且timeStamp是您的排序键,则可以执行以下读取操作:

Get Item: Find item with userId = ABC and timeStamp = 123
Query by Partition Key: Find all items with userId = ABC
Query by Partition Key and Sort Condition:  Find all items with userId = ABC and timeStamp is < 100

(来源:AWSMobileHub自动生成的示例)