繁体   English   中英

python如何查询AWS DynamoDB?

[英]How do I query AWS DynamoDB in python?

我对 NoSQL 和使用 AWS DynamoDB 还很陌生。 我正在使用 python 从 AWS Lambda 调用它 2.7 我正在尝试从order_number字段中检索一个值。
这是我的表的样子(只有一条记录。):
在此处输入图像描述

主分区键:subscription_id 在此处输入图像描述


和我的二级全球索引:order_number
在此处输入图像描述

我的设置正确吗? 如果给出 order_number,我如何使用 python 检索记录?
我无法弄清楚执行此操作的语法。

我试过了

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

但我得到:
An error occurred (ValidationException) when calling the GetItem operation: The provided key element does not match the schema: ClientError

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 添加到现有表中。 以前,您必须删除表并重新开始。

确保你已经导入了这个:

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

如果不需要过滤器,则不要在查询中使用FilterExpression

import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb', region_name=region_name)
table = dynamodb.Table(tableName)

def queryDynamo(pk, sk):
    response = table.query(
        ProjectionExpression="#pk, #sk, keyA, keyB",
        ExpressionAttributeNames={"#pk": "pk", "#sk": "sk"},
        KeyConditionExpression=
            Key('pk').eq(pk) & Key('sk').eq(sk)
    )
    return response['Items']

如果您使用 boto3 dynamodb客户端,您可以执行以下操作(同样您需要使用 subscription_id,因为它是主键):

dynamodb = boto3.client('dynamodb')
response = dynamodb.query(
    TableName='recurring_charges', 
    KeyConditionExpression="subscription_id = :subscription_id",
    ExpressionAttributeValues={":subscription_id": {"S": "id"}}
)

到目前为止,这是我发现的最干净的方法; query格式为JSON

dynamodb_client = boto3.client('dynamodb')

def query_items():
    arguments = {
        "TableName": "your_dynamodb_table",
        "KeyConditions": {
            "att_1": {"ComparisonOperator": "EQ", "AttributeValueList": [{"S": "value"}]},
        },
        "QueryFilter": {
            "att_2": {"ComparisonOperator": "NULL"},
        },
    }
    return dynamodb_client.query(**arguments)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM