无法使用python从AWS dynamodb获取_项?

无法使用python从AWS dynamodb获取_项?,python,amazon-dynamodb,boto3,Python,Amazon Dynamodb,Boto3,我是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_se

我是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)
回溯(最近一次呼叫最后一次):
文件“get-data-dynamodb-boto3.py”,第19行,在
response=table.get_项(TableName='Garbage\u collector\u table',Key={'topic':my\u topic})文件
“/usr/local/lib/python2.7/dist-packages/boto3/resources/factory.py”,
第518行,正在执行
response=action(self,*args,**kwargs)文件“/usr/local/lib/python2.7/dist-packages/boto3/resources/action.py”,
第83行,通话中__
response=getattr(parent.meta.client,operation_name)(**参数)文件“/usr/local/lib/python2.7/dist packages/botocore/client.py”,第行
258,in_api_调用
返回self._make_api_call(操作名称,kwargs)文件/usr/local/lib/python2.7/dist packages/botocore/client.py”,第548行,
在"make"api"调用中
raise ClientError(已解析的\u响应、操作\u名称)
botocore.exceptions.ClientError:发生错误 (ValidationException)调用GetItem操作时:提供 键元素与架构不匹配


我的代码中遗漏了什么吗?

您正在混合资源对象和客户端对象,它们具有不同的方法

资源的正确语法为:

response = table.get_item(Key={'topic': my_topic})
但我个人建议使用boto客户端:

client = boto3.client('dynamodb')

response = client.get_item(TableName='Garbage_collector_table', Key={'topic':{'S':str(my_topic)}})

您还可以查询数据库:

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 items[0]
else:
    return []

来源:

假设表中只有分区键(又称散列键)

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

这里有一些实际的例子:

在您的情况下,您需要执行以下操作:

response = table.get_item(TableName='Garbage_collector_table', Key={'topic': my_topic})

如果您也有排序键,则:

dynamodb = boto3.client('dynamodb', region_name=AWS_REGION, aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCCESS_KEY)
        
response = dynamodb.get_item(
     TableName=str(os.environ['DYNAMODB_TABLE']), 
     Key={'task_id' : {
           'S' : str(task_id)
           },
          'mac' : {
           'S' : 'AA-00-04-00-XX-YX'
           }
         }
 )

我是Lucid Dynamodb的作者,它是AWS Dynamodb的一个极简包装器。使用我的库可以很容易地解决这个问题

参考资料:


这种方式对我不起作用。起作用的是公司的
Key
Key={'topic':my_topic}
I echo@Marcin,被接受的答案对我不起作用,而
Key={'topic':my_topic}的格式是
Key={'topic
确实有效。谢谢@Tomiwa。为了防止这对任何人都有帮助,如果响应中没有“Items”,上面的代码将抛出错误。最好检查
如果响应中有“Items”:Items=response[“Items”]
Good point@dillon,或者您也可以执行
Items=response.get(“Items”,None)
Items=response.get(“Items”)“,[])
虽然这段代码可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满你的代码,这会降低代码和解释的可读性!
dynamodb = boto3.client('dynamodb', region_name=AWS_REGION, aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCCESS_KEY)
        
response = dynamodb.get_item(
     TableName=str(os.environ['DYNAMODB_TABLE']), 
     Key={'task_id' : {
           'S' : str(task_id)
           },
          'mac' : {
           'S' : 'AA-00-04-00-XX-YX'
           }
         }
 )
from LucidDynamodb.Operations import DynamoDb
import os
import logging
logging.basicConfig(level=logging.INFO)

AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")

if __name__ == "__main__":
    db = DynamoDb(region_name="us-east-1", 
                aws_access_key_id=AWS_ACCESS_KEY_ID, 
                aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
    item = db.read_item(
        TableName="test", 
        Key={
            'topic': "1"
        })
    if(item != None):
        logging.info("Item: {}".format(item))
    else:
        logging.warning("Item doesn't exist")