查询DynamoDB ISO-8601日期索引小于条件

时间:2017-03-18 20:34:32

标签: python python-2.7 amazon-dynamodb boto boto3

我有一个DynamoDB索引,以iso-8601格式存储日期,[即' 2017年3月17日&#39]。我想查询索引的日期少于特定日期。 [即datetime.now() - 30天]。

我相信这是对亚马逊API文档的支持。我似乎错过了使用boto3语法的东西。

我在boto3中使用资源而不是客户端。

我知道我可以使用纪元,但我想使用ISO格式来提高可读性。

这是我的测试代码。

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

ddb = boto3.resource('dynamodb')
_table = ddb.Table('TableWithDateIndex')

response2 = _table.query(
    IndexName='DeleteDate-index',
    KeyConditionExpression=Key('IndexDate').lt('2017-04-17')
)

print response2['Items']

失败:

botocore.exceptions.ClientError:调用Query操作时发生错误(ValidationException):不支持查询键条件

1 个答案:

答案 0 :(得分:0)

因此,IndexDate是“DeleteDate-index”索引的哈希键。使用Query时,必须为哈希键提供相等条件,即<!DOCTYPE html> <html> <head> <!-- Customize the content security policy in the meta tag below as needed. Add 'unsafe-inline' to default-src to enable inline JavaScript. For details, see http://go.microsoft.com/fwlink/?LinkID=617521 --> <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *"> <meta name="format-detection" content="telephone=no"> <meta name="msapplication-tap-highlight" content="no"> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"> <link rel="stylesheet" type="text/css" href="css/index.css"> <title>Eventia</title> <link rel="stylesheet" href="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css"> <script src="//code.jquery.com/jquery-1.10.2.min.js"></script> <script src="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script> </head> <body> <script type="text/javascript"> $(document).on("click", ".gg2", function () { console.log('hello'); $('.gg2').css('background-color', 'blue'); }); </script> <div class="gg" style="background: none"> <div class="gg2"> hello world </div> </div> </body> </html> 。换句话说,您不能在{Query}中使用.eq()ltltegt等比较运算符和散列键。在KeyConditionExpression中,这些运算符只能应用于范围键。

以下摘自documentation

  

在Query操作中,使用KeyConditionExpression参数   确定要从表或索引中读取的项目。你必须   将分区键名称和值指定为相等条件。您   可以选择为排序键提供第二个条件(如果   本)。

您可以使用“扫描”操作代替“查询”。运行Scan时,您可以在FilterExpression中的任何字段上使用任何运算符(或者根本不使用任何条件)。虽然你应谨慎使用Scan,因为它可能是一个非常重量级的操作:它意味着读取表中的每个项目(或二级索引)。