Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use "range_key_condition" to query a DynamoDB table with boto?

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'
like image 957
Andrew_1510 Avatar asked Mar 06 '12 13:03

Andrew_1510


1 Answers

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

like image 164
garnaat Avatar answered Oct 13 '22 05:10

garnaat