如何使用“range_key_condition”查询带有boto的DynamoDB表?

时间:2012-03-06 13:36:02

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

要获得(0,9999)之间的range_key,我可以这样做吗?

conn = boto.connect_dynamodb()
table = conn.get_table("mytable")
...
result = table.query(
      hash_key = "66", 
      range_key_condition = {"0":"GE", "9999":"LE"}
      )

与boto v2.2.2-dev,我总是得到空结果

编辑:这是另一个错误示例:

In [218]: qa = taa.query(hash_key = "1")

In [219]: qa.next()
Out[219]: {u'attra': u'this is attra', u'key': u'1', u'range': 1.1}

没有上面的“range_key_condition”

就可以了
In [220]: qa = taa.query(hash_key = "1", range_key_condition = {0.1: "GE"})

In [221]: qa.next()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/home/user/python/enva/<ipython-input-221-dba0a498b6e1> in <module>()
----> 1 qa.next()

/home/user/python/enva/local/lib/python2.7/site-packages/boto-2.2.2_dev-py2.7.egg/boto/dynamodb/layer2.pyc
in query(self, table, hash_key, range_key_condition,
attributes_to_get, request_limit, max_results, consistent_read,
scan_index_forward, exclusive_start_key, item_class)
    559         """
    560         if range_key_condition:
--> 561             rkc = self.dynamize_range_key_condition(range_key_condition)
    562         else:
    563             rkc = None

/home/user/python/enva/local/lib/python2.7/site-packages/boto-2.2.2_dev-py2.7.egg/boto/dynamodb/layer2.pyc
in dynamize_range_key_condition(self, range_key_condition)
    83         structure required by Layer1.
    84         """
---> 85         return range_key_condition.to_dict()
   86
   87     def dynamize_scan_filter(self, scan_filter):

AttributeError: 'dict' object has no attribute 'to_dict'

2 个答案:

答案 0 :(得分:5)

如果您使用的是最新版本的boto(看起来很像),那么条件已经从以前的版本更改为尝试使查询更具可读性。试试这个:

from boto.dynamodb.condition import *
conn = boto.connect_dynamodb()
table = conn.get_table("mytable")
...
result = table.query(
  hash_key = "66", 
  range_key_condition = BETWEEN(0, 9999))

它应该可以工作,虽然你必须更新你的boto代码,因为我在调查这个问题时发现了BETWEEN中的一个错误(见https://github.com/boto/boto/issues/620)。

答案 1 :(得分:1)

API开始,您不清楚是否允许包含多个条件。如果你只是单独做一个条件,它会起作用吗?此外,有一个BETWEEN运算符可能适合您:range_key_condition = {(0,10000):"BETWEEN"},但如果您的值是真正的字符串而不是数字,它可能不起作用。我没有使用过这个API,所以我可能会在boto邮件列表或IRC上询问。

更新:根据您刚添加的错误消息并查看github上的Boto代码,我认为这是Boto中的错误。 Table.query只需致电Layer2.queryLayer2.query期望range_key_condition是Condition对象(具有to_dict方法),但是您提供常规dict(显然没有to_dict方法)。 Table.query应该将您的dict转换为Condition对象并将其提供给Layer2.query,但它不会。我会去邮件列表或IRC寻求帮助。