我在为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
答案 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自动生成的示例)