Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中查询AWS DynamoDB?_Python_Amazon Web Services_Aws Lambda_Nosql - Fatal编程技术网

如何在python中查询AWS DynamoDB?

如何在python中查询AWS DynamoDB?,python,amazon-web-services,aws-lambda,nosql,Python,Amazon Web Services,Aws Lambda,Nosql,我对NoSQL和使用AWS DynamoDB相当陌生。我使用Python2.7从AWS Lambda调用它 我正在尝试从“订单号”字段中检索值。 这就是我的表的外观(只有一条记录): 主分区键:订阅\u id 和我的第二个全局索引:订单号 我的设置正确吗? 如果给定了顺序号,如何使用python检索记录? 我想不出做这件事的语法。 我试过了 response = table.get_item( Key = {'order_number': myordernumber} ) 但我得到: 调

我对NoSQL和使用AWS DynamoDB相当陌生。我使用Python2.7从AWS Lambda调用它 我正在尝试从“订单号”字段中检索值。
这就是我的表的外观(只有一条记录):

主分区键:订阅\u id


和我的第二个全局索引:订单号

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

我试过了

response = table.get_item( Key = {'order_number': myordernumber} )
但我得到:

调用GetItem操作时发生错误(ValidationException):提供的键元素与架构不匹配:ClientError不会自动为对象的所有字段编制索引。默认情况下,您可以定义散列键(
subscription\u id
,在您的情况下)和范围键(可选),这些将被索引。所以,你可以这样做:

response = table.get_item(Key={'subscription_id': mysubid})
它将按预期工作。但是,如果您希望根据订单号检索项目,则必须使用
扫描操作,该操作将查找表中的所有项目,以找到具有正确值的项目。这是一项非常昂贵的手术。或者,您可以在表中创建一个全局二级索引,该索引使用
order\u number
作为主键。如果这样做并调用新索引
order\u number-index
,则可以查询与特定订单号匹配的对象,如下所示:

from boto3.dynamodb.conditions import Key, Attr

response = table.query(
    IndexName='order_number-index',
    KeyConditionExpression=Key('order_number').eq(myordernumber))
DynamoDB是一个非常快速、可伸缩且高效的数据库,但它确实需要大量考虑您可能需要搜索哪些字段以及如何高效地进行搜索


好消息是,现在可以将GSI添加到现有表中。以前,您必须删除表格,然后重新开始。

请确保已导入以下内容:

from boto3.dynamodb.conditions import Key, Attr
如果你没有它,你肯定会得到错误。在房间里


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

要使用带过滤器的索引查询dynamodb:

import boto3
from boto3.dynamodb.conditions import Key, Attr

dynamodb = boto3.resource('dynamodb', region_name=region)
table = dynamodb.Table('<TableName>')

response = table.query(
    IndexName='<Index>',
    KeyConditionExpression=Key('<key1>').eq('<value>') & Key('<key2>').eq('<value>'),
    FilterExpression=Attr('<attr>').eq('<value>')
)

print(response['Items'])
导入boto3
从boto3.dynamodb.conditions导入键Attr
dynamodb=boto3.resource('dynamodb',region\u name=region)
表=发电机表(“”)
response=table.query(
IndexName=“”,
KeyConditionExpression=键(“”).eq(“”)和键(“”).eq(“”),
FilterExpression=Attr(“”).eq(“”)
)
打印(响应['Items'])

如果不需要筛选器,则不要在查询中使用
filtereexpression

感谢您的帮助,我尝试了您给我的查询代码,它给我的
全局名称“Key”没有定义
并且它引用了您给我的代码行
KeyConditionExpression=Key('order\u number')。eq(myordernumber))
这就是我的函数的样子
def getRecord(self,table\u name,indexName,gsiKey,gsiValue):table=self.dynamodb.table(table\u name)response=table.query(indexName=indexName,KeyConditionExpression=Key(gsiKey).eq(gsiValue))
不管我怎么想,我只导入boto3,但需要从boto3.dynamodb.conditions导入键Attr执行
^。如果答案中包含此评论,那就太好了:)