如何在python中查询AWS DynamoDB?

2024-06-01 07:08:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我对NoSQL和AWS DynamoDB还比较陌生。我用python 2.7从AWS Lambda调用它 我正试图从“订单号”字段中检索值。
这就是我的桌子的样子(只有一个记录):
enter image description here

主分区密钥:订阅id enter image description here



我的第二个全局索引:订单号
enter image description here

我的设置正确吗? 如果给定顺序号,如何使用python检索记录?
我想不出做这件事的语法。

我试过了

response = table.get_item( Key = {'order_number': myordernumber} )

但我得到:
调用GetItem操作时出错(ValidationException):提供的键元素与架构不匹配:ClientError


Tags: lambdaawsid记录密钥全局dynamodbnosql
2条回答

确保已导入此:

from boto3.dynamodb.conditions import Key, Attr

如果你没有它,你肯定会得到错误。在documentation examples里。

感谢@altoids的评论,因为这是我的正确答案。我想用一个“正式”的回答来引起大家的注意。

DynamoDB不会自动索引对象的所有字段。默认情况下,您可以定义一个散列键(在您的示例中为subscription_id),还可以选择定义一个范围键和那些将被索引的范围键。所以,你可以这样做:

response = table.get_item(Key={'subscription_id': mysubid})

它将如预期的那样工作。但是,如果要基于order_number检索项,则必须使用scan操作,该操作会查看表中的所有项,以找到具有正确值的项。这是一个非常昂贵的手术。或者可以在表中创建一个全局辅助索引,使用order_number作为主键。如果这样做并调用新索引order_number-index,则可以查询与特定订单号匹配的对象,如下所示:

from boto3.dynamodb.conditions import Key, Attr

response = table.query(
    IndexName='order_number-index',
    KeyConditionExpression=Key('order_number').eq(myordernumber))

DynamoDB是一个非常快速、可伸缩和高效的数据库,但它确实需要考虑您可能希望搜索哪些字段以及如何高效地搜索。

好消息是,现在可以将GSI添加到现有表中。以前你必须删除你的表并重新开始。

相关问题 更多 >