Reputation: 13526
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"}
)
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}
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'
Upvotes: 5
Views: 8296
Reputation: 2776
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.
Upvotes: 1
Reputation: 45846
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).
Upvotes: 5