3

在浏览了文档和各种教程之后,我无法弄清楚如何设置或更新作为多值数据类型(数字或字符串集)的发电机项的属性。我正在使用 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 一起使用将不胜感激!我猜我忽略了一些简单的事情。谢谢!

4

3 回答 3

7

好的,我们能够自己解决这个问题。我上面示例的问题是我使用的是列表而不是集合。多值属性的值必须是一个集合。

例如,这有效:

Item(Table('test'), data={'id': '123', 'content': 'test', 'list': set([1,2,3,4])}).save()
于 2013-09-24T16:28:13.113 回答
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
############################################################
于 2014-11-30T20:15:26.290 回答
1

这通常适用于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'
    }
)

您的数据将按如下方式保存:

在此处输入图像描述

于 2019-05-02T00:49:46.687 回答