在搜索了文档和各种教程之后,我无法弄清楚如何设置或更新作为多值数据类型(数字或字符串集)的dynamo项的属性。我正在使用boto(boto.dynamodb2,具体而言 - 不是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将非常感激!我猜我忽略了一些简单的东西。谢谢!
答案 0 :(得分:7)
好的,我们能够自己解决这个问题。我上面的例子的问题是我使用的是列表而不是集合。多值属性的值必须是一个集合。
例如,这有效:
Item(Table('test'), data={'id': '123', 'content': 'test', 'list': set([1,2,3,4])}).save()
答案 1 :(得分:1)
DnyamoDB现在直接支持Dict / List。 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
############################################################
答案 2 :(得分:0)
这通常可以与boto3一起使用:
session = boto3.Session(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)
dynamodb = session.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('table')
list = ['1','2','3']
table.put_item(
Item={
'id': 01,
'message': list,
'timestamp': '2019-05-01 22:14:00'
}
)
您的数据将按以下方式保存: