【问题标题】:Not able to get_item from AWS dynamodb using python?无法使用 python 从 AWS dynamodb 获取项目?
【发布时间】:2016-06-02 10:28:14
【问题描述】:

我是 dynamodb 的新手,试图从 dynamodb 获取数据。

This is my table with "topic" as a primary hash key

我的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:发生错误 (ValidationException) 调用 GetItem 操作时:提供的 关键元素与架构不匹配

我的代码中是否遗漏了任何内容?

【问题讨论】:

    标签: python amazon-dynamodb boto3


    【解决方案1】:

    您正在混合具有不同方法的资源和客户端对象。 More info here.

    资源的正确语法是:

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

    http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html

    【讨论】:

    • 这种方式对我不起作用。有效的是公司Key={'topic': my_topic}中的Key
    • 我回应 @Marcin,接受的答案对我不起作用,而格式 Key={'topic': my_topic} 确实有效。
    【解决方案2】:

    也可以查询数据库:

    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 []
    

    来源:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.04.html

    【讨论】:

    • 谢谢@Tomiwa。以防万一这对任何人都有帮助,如果“项目”不在响应中,上述代码将引发错误。最好检查if "Items" in response: items = response["Items"]
    • 好点@dillon,或者你也可以做items = response.get("Items", None)或items = response.get("Items", [])
    【解决方案3】:

    假设你的表中只有分区键(又名哈希键)。

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

    【讨论】:

      【解决方案4】:

      这里有实际的例子: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/dynamodb.html

      在你的情况下,你需要这样做:

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

      【讨论】:

        【解决方案5】:

        我是 Lucid-Dynamodb 的作者,它是 AWS DynamoDB 的极简包装器。使用我的库可以轻松解决这个问题。

        参考:https://github.com/dineshsonachalam/Lucid-Dynamodb#4-read-an-item

        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")
        

        【讨论】:

          【解决方案6】:

          如果你也有排序键,那么:

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

          【讨论】:

            【解决方案7】:
            # Have the IAM role containing policy *AmazonDynamoDBFullAccess* assigned to your lambda function
            
            import boto3
            
            def lambda_handler(event, context):
            
                try:
                    dynamodb_client = boto3.client('dynamodb')
                    response = dynamodb_client.get_item(
                                TableName="Garbage_collector_table",
                                Key={
                                     'topic':
                                            {'S':str(my_topic)}
                                    }
                                )
                except Exception as error:
                    print(error)
                    raise
                else:
                    print(f'Response = {response}')
                    return response
            

            【讨论】:

            • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
            猜你喜欢
            • 1970-01-01
            • 2022-10-17
            • 1970-01-01
            • 1970-01-01
            • 2020-06-24
            • 2017-11-19
            • 1970-01-01
            • 2023-01-20
            • 1970-01-01
            相关资源
            最近更新 更多