如何使用Python查找Dynamo数据库数据

时间:2019-03-05 06:47:22

标签: python-3.x amazon-dynamodb

现在我在Dynamodb中有一个类似下面的列(Statuscode_Env)作为分区键。

1。在这里,每当我传递一个值(如(421、425等))时,都应给出相应的代码存在(如此处的PRD)。

2。反之亦然,如果我将参数作为PRD传递,它应该给出相应的数字,例如(421、425、427等)。

我可以通过在2列(部分关键字,排序关键字)中实现以下内容来实现。我可以达到第一种情况,但是我不能。因为我只能使用分区键进行搜索。因此,将数据存储在分隔符为“空格”的单列中

Statuscode_Env
421 PRD
425 PRD
427 PRD
422 PRD
426 PRD
423 PRD
429 PRD
428 PRD
422 PRD

import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('env')
response = table.query(KeyConditionExpression=Key('Statuscode_Env').eq('422 PRD'))
for i in response['Items']:
    print(i['Statuscode_Env'])

以上述方式进行操作,不正确...尝试过“ Contatins”和“ beginswith”,但没有解决问题。

假设我要更新代码/名称,如何使用python和dynamodb实现。

name | code
-----------
PRD  | 425
PRD  | 456
PRD  | 427

1 个答案:

答案 0 :(得分:1)

KeyConditionExpression只能应用于分区,也可以应用于排序键。 documentation声明以下内容。

  

使用KeyConditionExpression参数为分区键提供特定的值。查询操作将使用该分区键值返回表或索引中的所有项目。您可以选择通过在KeyConditionExpression中指定排序键值和比较运算符来缩小Query操作的范围。

同一文档继续

  

要进一步优化查询结果,可以选择提供FilterExpression。 FilterExpression确定应将结果中的哪些项目退还给您。其他所有结果都将被丢弃。

因此,您可以使用FilterExpression进一步缩小结果集的范围,这可能会为您的第二个用例提供支持。

如果这还不够,您可能需要专门研究using indexes(全球二级指数(GSI))。基本上,索引将创建另一个具有不同键的表。为了满足您的第二个要求,我认为以下GSI结构可能有效。

name | code
-----------
PRD  | 425
PRD  | 456
PRD  | 427
....

name是分区键,而代码是排序键。但是这些属性对必须始终为每个记录构成一个唯一的主键,否则您将无法使用此结构。

附录:查看了我的帖子并重新阅读了您的问题后,我意识到您没有单独的名称和代码属性,而是一个带有“ PRD 425”和“ PRD 426”。我对此没有经验。查询文档再次对KeyConditionExpression

说了以下内容
  

为Query操作要检索的项目指定键值的条件。

     

该条件必须对单个分区键值执行相等性测试。

     

该条件可以选择对单个排序键值执行多个比较测试之一。这使Query可以检索具有给定分区键值和排序键值的一项,或者检索具有相同分区键值但排序键值不同的几项。

我的理解是,您不能以所需的方式限制它。

附录2 :经过深思熟虑,我记得DynamoDB documentations通常建议一种策略,例如,分区键后缀有随机数。不幸的是,我没有关于如何对该模式执行查询的详细信息,但是它应该为您提供有关组织数据的提示。