Question

To get range_key between (0,9999), can I do it this way?

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

with boto v2.2.2-dev, I always get empty results

EDIT: This is a another error sample:

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}

It's OK without "range_key_condition" above

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'
Was it helpful?

Solution

If you are using the latest version of boto (and it looks like you are) the way conditions have been changed from previous versions in an attempt to make the query more readable. Try this:

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))

It should work although you will have to update your boto code since I just discovered a bug in BETWEEN while investigating this question (see https://github.com/boto/boto/issues/620).

OTHER TIPS

From the API, It's not clear that you're allowed to include more than one condition. Does it work if you just do one of the conditions alone? Also, there is a BETWEEN operator which may work for you: range_key_condition = {(0,10000):"BETWEEN"}, but it may not work if your values are truly strings rather than numbers. I haven't used this API, so I'd probably ask on the boto mailing list or IRC.

Update: Based on the error message that you just added and looking at the Boto code on github, I think this is a bug in Boto. Table.query just calls Layer2.query. Layer2.query expects range_key_condition to be a Condition object (which has a to_dict method), but you provide a regular dict (which obviously doesn't have a to_dict method). Table.query should be converting your dict to a Condition object and providing it to Layer2.query, but it doesn't. I'd go to the mailing list or IRC for help.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top