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 で動作させる方法を教えてください。私は単純なものを見落としていると思います。ありがとう!

4

3 に答える 3

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 に答える