2014-02-13 79 views
4

這是我尋求從常規DynamoDB表切換到具有全局輔助索引的DynamoDB2表的繼續**。如何僅使用boto 2.25.0按全局二級索引查詢DynamoDB2表?

所以我創造了我的表所示here,然後添加了以下兩個要素:

table.put_item(data={'firstKey': 'key01', 'message': '{"firstKey":"key01", "comments": "mess 1 w/o secondKey"}'}) 
table.put_item(data={'firstKey': 'key02', 'secondKey':'skey01', 'message': '{"firstKey":"key02", "parentId":"skey01", "comments": "mess 2 w/ secondKey"}'}) 

我想現在要做的就是找回通過它們(我)唯一firstKey值的項目或(ii)唯一secondKey值。第一個很容易:

res1 = table.get_item(firstKey='key01') 
res1['message'] 

我想不出如何做第二個。這是行不通的:

res2 = table.get_item(secondKey='skey01') 

產生The provided key element does not match the schema。好的,這是預期的。當我這樣做:

res2 = table.query(secondKey='skey01',index='secondKeyIndex') 

我得到You must specify more than one key to filter on

那麼我如何才能使它工作?請注意,當我有一個項目的價值secondKey,我不知道其相應的firstKey

===== 更新:這裏是我試過幾個其他的事情:

res2 = table.query(secondKey__eq='skey01',index='secondKeyIndex') 

生產

boto.dynamodb2.exceptions.QueryError: You must specify more than one key to filter on. 

在下面的塊, query聲明沒有產生任何錯誤

res2 = table.query(secondKey='skey01',secondKey__eq='skey01',index='secondKeyIndex') 
for r in res2: 
    print res2['secondKey'] 

print給我

boto.dynamodb2.exceptions.UnknownFilterTypeError: Operator 'secondKey' from 'secondKey' is not recognized. 

回答

5

它採用LSI/GSI是可能的。

看到boto教程這裏(搜索LSI,你會得到的例子)。 DynamoDB2 - boto v2.25。0:http://boto.readthedocs.org/en/latest/ref/dynamodb2.html

添加完整工作實例(試圖用發電機本地:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html

conn = DynamoDBConnection(
    host='localhost', 
    port=8000, 
    aws_access_key_id='DEVDB', #anything will do 
    aws_secret_access_key='DEVDB', #anything will do 
    is_secure=False) 
tables = conn.list_tables() 
print "Before Creation:", tables 

table_name = 'myTable' 
if table_name not in tables['TableNames']: 
    Table.create(table_name 
     , schema=[HashKey('firstKey')] 
     , throughput={'read': 5, 'write': 2} 
     , global_indexes=[ 
      GlobalAllIndex('secondKeyIndex', parts=[HashKey('secondKey')], throughput={'read': 5, 'write': 3})] 
     , connection=conn 
    ) 
    #print_table_details(conn, table_name) 
table = Table(table_name, connection=conn) 
item = Item(table, data={ 
    'firstKey': str(uuid.uuid4()), 
    'secondKey': 'DUMMY-second' 
}) 
item.save() 
results = table.query(secondKey__eq='DUMMY-second', index='secondKeyIndex') 
for res in results: 
    print res['firstKey'], res['secondKey'] 

執行的結果是:

91d4d056-1da3-42c6-801e-5b8e9c42a93f DUMMY-second 
15c17b09-4975-419a-b603-427e4c765f03 DUMMY-second 
dd947b7d-935e-458f-84d3-ed6cd4f32f5a DUMMY-second 

另外添加的確切包(由於Dynamo1/2 - 有錯誤的機會):

from boto.dynamodb2.fields import HashKey, RangeKey, GlobalAllIndex 
from boto.dynamodb2.layer1 import DynamoDBConnection 
from boto.dynamodb2.table import Table 
from boto.dynamodb2.items import Item 
+0

嗯,我讀了幾遍重讀這個頁面幾次試圖讓這個工作。我知道這可以通過AWS控制檯完成,但現在我需要弄清楚如何使用'boto'以編程方式執行此操作。你能告訴我我的例子上面的確切查詢語法?謝謝順便說一句,如果我需要修改創建表的方式來完成這項工作,那也沒關係。我只需要能夠通過'firstKey'或'secondKey'來檢索項目。 –

+0

好的你在這裏:我已經用完整的工作例子編輯了上面的答案。我剛剛嘗試過並確保它可以與Dynamo DB Local配合使用。人們面臨的一個常見問題是使用舊版本的Dynamo Local。確保你下載最新的並嘗試。我現在嘗試與dynamodb_local_2013-12-12 –

+0

請嘗試讓我知道這是否適合你! –

0

查詢參數的格式不同。 我還沒有嘗試過,但我相信語法應該是:

res2 = table.query(secondKey__eq='skey01',index='secondKeyIndex') 
相關問題