Dynamodbからデータを取得しようとするdynamodbは初めてです。
これはプライマリハッシュキーとして「トピック」を持つ私のテーブルです
私のpythonコード
import boto3
from boto3 import dynamodb
from boto3.session import Session
from boto3.dynamodb.conditions import Key, Attr
dynamodb_session = Session(aws_access_key_id='XXXXXXXXXXXXXXX',
aws_secret_access_key='XXXXXXXXXXXXXXXXXXXXXXXXXXXX',
region_name='us-east-1')
dynamodb = dynamodb_session.resource('dynamodb')
table=dynamodb.Table('Garbage_collector_table')
my_topic = "$aws/things/garbage_collector_thing/shadow/update/accepted"
response = table.get_item(TableName='Garbage_collector_table', Key={'topic':my_topic})
for res in response:
print "result ",res
次のエラーが発生します
Traceback (most recent call last):
File "get-data-dynamodb-boto3.py", line 19, in <module>
response = table.get_item(TableName='Garbage_collector_table', Key={'topic': my_topic}) File
"/usr/local/lib/python2.7/dist-packages/boto3/resources/factory.py",
line 518, in do_action
response = action(self, *args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/boto3/resources/action.py",
line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params) File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line
258, in _api_call
return self._make_api_call(operation_name, kwargs) File /usr/local/lib/python2.7/dist-packages/botocore/client.py", line 548,
in _make_api_call
raise ClientError(parsed_response, operation_name)
botocore.exceptions.ClientError:GetItem操作の呼び出し時にエラーが発生しました(ValidationException):指定されたキー要素がスキーマと一致しません
コードに何か足りないものはありますか?
正しい構文は次のとおりです。
response = table.get_item(TableName='Garbage_collector_table', Key={'topic':{'S':str(my_topic)}})
しかし、個人的にはbotoクライアントを使用することをお勧めします:
client = boto3.client('dynamodb')
response = client.get_item(TableName='Garbage_collector_table', Key={'topic':{'S':str(my_topic)}})
http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html
データベースにクエリを実行することもできます。
from boto3.dynamodb.conditions import Key
table = dynamodb.Table(table_name)
response = table.query(
KeyConditionExpression=Key('topic').eq(my_topic)
)
items = response['Items']
if items:
return item[0]
else:
return []
ソース: https://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.04.html
テーブルにパーティションキー(別名ハッシュキー)しかない場合。
import boto3
dynamodb = boto3.resource('dynamodb',region_name='ap-southeast-2')
table = dynamodb.Table('my-table')
key = {}
key['key'] = 'my-key'
print(key)
response = table.get_item(Key=key)
print(response['Item'])
ここに実際の例があります: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/dynamodb.html
あなたの場合、あなたはこれをする必要があります:
response = table.get_item(TableName='Garbage_collector_table', Key={'topic': my_topic})