2013-09-23 39 views
3

在對文檔和各種教程進行精練後,我無法弄清楚如何設置或更新多值數據類型(數字或字符串集)的Dynamo Item上的屬性。我使用boto(boto.dynamodb2,具體 - 不boto.dynamodb)。使用boto的DynamoDB中的多值數據

嘗試這樣的事情(其中 'ID' 是哈希鍵):

Item(Table('test'), data={'id': '123', 'content': 'test', 'list': [1,2,3,4]}).save() 

導致此錯誤:

TypeError: Unsupported type "<type 'list'>" for value "[1, 2, 3, 4]" 

我喜歡這種感覺必須在boto.dynamodb2是可能的,但奇怪的是,我找不到任何人這樣做的例子。 (每個人都只是設置數字或字符串屬性,而不是數字集或字符串集屬性。)

任何有關此主題的見解以及我如何得到此與boto一起工作將非常感激!我在猜測我忽略了一些簡單的事情。謝謝!

回答

7

好的,我們可以自己弄清楚這一點。我上面的例子的問題是我使用的是一個列表而不是一個集合。多值屬性的值必須是一個集合。

例如,這個工程:

Item(Table('test'), data={'id': '123', 'content': 'test', 'list': set([1,2,3,4])}).save() 
+0

感謝您指出這一點!不幸的是,這限制了在DynamoDB中使用多值屬性,因爲set()不能多次具有相同的值。這對於標籤等東西是可以的,但它不適用於任意數字值的列表。 – Marian

+0

快速問題:你知道1)是否有可能有其他類型的列表作爲集合拋出(例如:字典/地圖)2)有嵌套值,假設#1是可行的?根據[this](http://www.allthingsdistributed.com/2014/10/document-model-dynamodb.html),應該可以有一個列表的字典,但我們不能使它工作。 –

1

DnyamoDB現在直接支持詞典/名單。 Boto目前還沒有支持它,但它只是一個小補丁,直到它在生產中得到支持。

############################################################ 
# Patch Dynamizer to support dict/list 
############################################################ 
from boto.dynamodb.types import Dynamizer, get_dynamodb_type 

def _get_dynamodb_type(self, attr): 
    if isinstance(attr, dict): 
    return 'M' 
    if isinstance(attr, list): 
    return 'L' 
    return get_dynamodb_type(attr) 

def _encode_m(self, attr): 
    result = {} 
    for k, v in attr.items(): 
    result[k] = self.encode(v) 
    return result 

def _decode_m(self, attr): 
    result = {} 
    for k, v in attr.items(): 
    result[k] = self.decode(v) 
    return result 

def _encode_l(self, attr): 
    return [self.encode(v) for v in attr] 

def _decode_l(self, attr): 
    return [self.decode(v) for v in attr] 

Dynamizer._get_dynamodb_type = _get_dynamodb_type 
Dynamizer._encode_m = _encode_m 
Dynamizer._decode_m = _decode_m 
Dynamizer._encode_l = _encode_l 
Dynamizer._decode_l = _decode_l 
############################################################ 
# End patch Dynamizer to support dict/list 
############################################################ 
+0

這或多或少在博託現在。 –

+1

Gary Linscott:你知道現在是否(2015年4月)Boto支持dynamodb'map'數據類型,更一般地說,將JSON文檔存儲爲項目屬性的值?在哪裏可以找到關於此的信息? –

+0

Boto v2.35.2現在支持'map'和'list'。 https://github.com/boto/boto/issues/2737雖然我還沒有找到好的文檔...... – lubar

相關問題