在table.query中使用attributes_to_get时出现Boto DynamoDB错误

时间:2012-04-30 19:38:32

标签: python boto amazon-dynamodb

我已经使用字符串哈希键和范围键设置了DynamoDB数据库。这有效:

>>> x = table.query(hash_key='asdf@asdf.com', range_key_condition=BEGINS_WITH("20"), 
    request_limit=5)
>>> [i for i in x]
[{u'x-entry-page': ...

这不,我不明白为什么不:

>>> x = table.query(hash_key='asdf@asdf.com', range_key_condition=BEGINS_WITH("20"), 
    attributes_to_get=[u'x-start-time'], request_limit=5)
>>> [i for i in x]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/boto-2.3.0-py2.7.egg/boto/dynamodb/layer2.py", line 588, in query
    yield item_class(table, attrs=item)
  File "/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/boto-2.3.0-py2.7.egg/boto/dynamodb/item.py", line 45, in __init__
    raise DynamoDBItemError('You must supply a hash_key')
boto.dynamodb.exceptions.DynamoDBItemError: BotoClientError: You must supply a hash_key

这对我来说毫无意义。我显然提供了一个哈希键。通过查看Boto源代码,我无法分辨出问题所在。有问题的属性肯定存在于每条记录中(不应该引发错误)。

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:2)

在同事的帮助下,我们已经明白了。问题是attributes_to_get需要散列和范围键的名称。所以,这有效:

>>> x = table.query(hash_key='asdf@asdf.com', range_key_condition=BEGINS_WITH("20"), 
    attributes_to_get=[u'x-start-time', 'user_id', 'session_time'], request_limit=5)
>>> [i for i in x]
[{u'session_time': u'2012/04/18 09:59:20.247 -0400', u'user_id': u'asdf@asdf.com', 
    u'x-start-time': u'2012/04/18 09:59:20.247 -0400'}, ...

这对我来说似乎是一个(次要的)Boto问题......

答案 1 :(得分:2)

巧合的是,这只是今天早些时候在博托修复的。参见:

https://github.com/boto/boto/issues/656