我有一个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):不支持查询键条件
答案 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()
,lt
,lte
,gt
等比较运算符和散列键。在KeyConditionExpression中,这些运算符只能应用于范围键。
以下摘自documentation:
在Query操作中,使用KeyConditionExpression参数 确定要从表或索引中读取的项目。你必须 将分区键名称和值指定为相等条件。您 可以选择为排序键提供第二个条件(如果 本)。
您可以使用“扫描”操作代替“查询”。运行Scan时,您可以在FilterExpression中的任何字段上使用任何运算符(或者根本不使用任何条件)。虽然你应谨慎使用Scan,因为它可能是一个非常重量级的操作:它意味着读取表中的每个项目(或二级索引)。