DynamoDB中使用boto的多值数据

问题描述 投票:3回答:3

在搜索了文档和各种教程之后,我无法弄清楚如何设置或更新作为多值数据类型(数字或字符串集)的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一起工作将非常感谢!我猜我忽略了一些简单的东西。谢谢!

python amazon-web-services boto amazon-dynamodb
3个回答
7
投票

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

例如,这有效:

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

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
############################################################

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'
    }
)

您的数据将保存如下:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.