为什么boto3的FilterExpression不能接受多个表达式?

时间:2018-11-20 08:09:57

标签: amazon-web-services amazon-dynamodb boto3 dynamodb-queries

我对自己做错了事感到困惑。据我所知,似乎我对boto3 dynamodb客户端的请求是完美的,但是运行查询时仍然没有得到任何结果。我怀疑这与FilterExpression有关,但我无法理解。

我正在使用zappa / flask组合来构建Web应用程序,并且正在使用dynamodb作为数据库。我的AWS凭证和权限很好-我知道因为可以运行更简单的查询而已。除此之外,该应用程序的更广泛上下文与我的问题无关。

我正在对象的上下文中运行以下命令:

args = {... see below ...}
self.db = boto3.client('dynamodb')
self.db.query(**args)

下面是我发送给客户端的args参数:

{"TableName": "clients", 
"IndexName": "client_id", 
"FilterExpression": "#filattr0 < :filattrval0 AND #filattr1 = :filattrval1", 
"KeyConditionExpression": "#keyindexattr0 = :keyindexvalue0", 
"ExpressionAttributeNames": {
    "#filattr0": "time", 
    "#filattr1": "status", 
    "#keyindexattr0": "client_id"
},
"ExpressionAttributeValues": {
    ":filattrval0": {"N": "1542696080"},
    ":filattrval1": {"S": "pending"},
    ":keyindexvalue0": {"S": "00000000-0000-0000-000000000000"}
},
"Limit": 100,
"ConsistentRead": false,
"Select": "ALL_ATTRIBUTES"}

我从此查询中得到的响应如下:

{'Items': [], 
'Count': 0, 
'ScannedCount': 8, 
'ResponseMetadata': {'RequestId': '*blahblahblah*', 
'HTTPStatusCode': 200, 
'HTTPHeaders': {
    'server': 'Server', 
    'date': 'Tue, 20 Nov 2018 06:41:20 GMT', 
    'content-type': 'application/x-amz-json-1.0', 
    'content-length': '39', 
    'connection': 'keep-alive', 
    'x-amzn-requestid': '*blahblahblah*',
    'x-amz-crc32': '*numbers*'},
    'RetryAttempts': 0
}}

现在,我正在通过AWS控制台查看dynamodb表,它在适当的表中向我显示了以下对象。实际上,当我在AWS网站上的dynamodb控制台的表视图中构造此查询时,它返回以下对象,因此我知道该参数对于AWS是可接受的:

# Taken from the JSON view of the item in the database
# I removed the UUIDs just in case...
{
    "client_id": "00000000-0000-0000-000000000000",
    "modify_date": "1542637150",
    "schedule_id": "00000000-0000-0000-000000000000",
    "software_version": "0.1",
    "status": "pending",
    "template_id": "00000000-0000-0000-000000000000",
    "time": "1542646800",
    "timezone": "PDT"
}

最奇怪的是,当我使用以下args变量运行查询时:

{'TableName': 'hmcmSchedule', 
'IndexName': 'client_id', 
'FilterExpression': '#filattr0 = :filattrval0', 
'KeyConditionExpression': '#keyindexattr0 = :keyindexvalue0',
'ExpressionAttributeNames': {
    '#filattr0': 'status', 
    '#keyindexattr0': 'client_id'
}, 
'ExpressionAttributeValues': {
    ':filattrval0': {'S': 'pending'},
    ':keyindexvalue0': {'S': '00000000-0000-0000-000000000000'}
}, 
'Limit': 100, 
'ConsistentRead': False, 
'Select': 'ALL_ATTRIBUTES'}

我从数据库中收到以下响应:

# UUIDs have once again been removed, just in case...
{'Items': [{
    'modify_date': {'S': '1542637150'}, 
    'template_id': {'S': '00000000-0000-0000-000000000000'}, 
    'software_version': {'S': '0.1'}, 
    'client_id': {'S': '00000000-0000-0000-000000000000'}, 
    'status': {'S': 'pending'}, 
    'timezone': {'S': 'PDT'}, 
    'time': {'S': '1542646800'}, 
    'schedule_id': {'S': '00000000-0000-0000-000000000000'}
}], 
'Count': 1, 
'ScannedCount': 8, 
'ResponseMetadata': {
    'RequestId': '*blahblahblah*', 
    'HTTPStatusCode': 200, 
    'HTTPHeaders': {
        'server': 'Server', 
        'date': 'Tue, 20 Nov 2018 07:55:59 GMT', 
        'content-type': 'application/x-amz-json-1.0', 
        'content-length': '348', 
        'connection': 'keep-alive', 
        'x-amzn-requestid': '*blahblahblah*', 
        'x-amz-crc32': '1922642857'
    }, 
    'RetryAttempts': 0}}

什么使我的FilterExpression无法正常工作?我已经检查了好几个小时,看不到森林覆盖树木。我广泛阅读了文档,并且我认为我已经涵盖了所有内容。

任何人都可以提供的帮助或见解将不胜感激...

1 个答案:

答案 0 :(得分:0)

不,@ Michael-sqlbot是正确的。原来,这个问题是我只是没有遇到的问题的综合。我一切都正确,但是我指定了ExpressionAttributeValues的部分是

所以这个:

"ExpressionAttributeValues": {
    ":filattrval0": {"N": "1542696080"},
    ":filattrval1": {"S": "pending"},
    ":keyindexvalue0": {"S": "00000000-0000-0000-000000000000"}
},

完全正确。我一直遇到的问题是,我将在不切换属性的情况下切换数据库,我设置的参数与数据库中的任何内容都不匹配,或者-正如@ Michael-sqlbot指出的那样,数据库中存储的时间值为不同的数据类型。

事实证明,您无法将数字与字符串进行比较。而且由于我是从Zappa尾部进行调试-从5m开始,我经常会发现错误的材料。

所以我是对的,代码确实有效,我并不疯狂,当我真的很累的时候我不应该编写代码。