python 使用Lambda查询不带PrimaryKey的DynamoDB

llycmphe  于 2023-05-21  发布在  Python
关注(0)|答案(2)|浏览(191)

我想用运行python的lambda函数查询我的DynamoDB。
DynamoDB表(名称:试验台):

*user_id(String)PrimaryKey

  • status(String)
  • destination(String)

我想查询代码中的表。我想让lambda函数返回所有user_idstatus属性带有active

table = dynamodb.Table('Testing-Table')
def lambda_handler(event, context):

response = table.query (
    KeyConditionExpression=Key('status').eq('active')
)

for i in response['Items']:
    print(i['user_id'],":",i['status'])

#return 'listing results'

我还添加了一个新的索引:

我尝试创建一个表,主键为status,我的代码工作...但是primarykey必须是唯一的,所以当我尝试在我的表中创建一个新项目时,我不能将status再次设置为active。
如有需要,我会在问题中加入更多资料。我将感谢你的帮助。
--编辑-* 只有status是我的表的PrimaryKey时,我的代码才有效。

  • 我的问题是 *:是否可以使用statusPartitionKey而不是PrimaryKeyused_id查询DynamoDB表?最重要的是...它是如何做到的?
iecba09b

iecba09b1#

我找到了我一直在寻找的东西:
我不得不像这样在代码中添加 IndexName

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Testing-Table')

def lambda_handler(event, context):

response = table.query (
    IndexName='status-index',
    KeyConditionExpression=Key('status').eq('active')
)

for i in response['Items']:
    print(i['user_id'],":",i['status'])

以下是结果的图像:

k3bvogb1

k3bvogb12#

还有一种替代方法可以在不依赖于 partition keysort key 的情况下定位项目。如果您有兴趣了解这些键的功能,可以参考此source.
之前的解决方案使用了table.query函数。但是,此解决方案将使用table.scan函数。有关 * 扫描 * 的更多信息,您可以在此处查阅官方文档。

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

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('table_name')

response = table.scan(
    FilterExpression=Attr('attribute_name').eq('value of attribute you want to find')
)
items = response['Items']
print(items)

为了确保完整性,不要忘记包含import语句from boto3.dynamodb.conditions import Key, Attr
如果您对探索scan函数的各种方法和选项感兴趣,可以参考here提供的文档
另外,请注意

  • 相比之下,扫描比查询相对较慢 *

相关问题