Почему FilterExpression в boto3 не принимает более 1 выражения? - PullRequest
0 голосов
/ 20 ноября 2018

Я действительно сбит с толку относительно того, что я делаю неправильно. Кажется, что запрос, который я делаю к клиенту boto3 Dynamodb, идеален из того, что я могу сказать, но я все еще не получаю никаких результатов, когда я запускаю запрос. Я подозреваю, что это как-то связано с FilterExpression, но я не могу этого понять.

Я использую комбо zappa / flask для создания веб-приложения, и я использую 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, он возвращает следующий объект, поэтому я знаю, что параметры приемлемы для 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 голосов
/ 20 ноября 2018

Нет, @ Michael-sqlbot был прав.Проблема оказалась комбинацией проблем, с которыми я просто не сталкивался.У меня все было правильно, но та часть, где я указывал ExpressionAttributeValues:

Так вот:

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

было совершенно правильно.У меня постоянно возникали проблемы, заключающиеся в том, что я переключал базы данных без переключения атрибутов, заданные параметры не совпадали ни с чем в базе данных, или - как указывал @ Michael-sqlbot - значение времени, хранимого в базе данных, былодругой тип данных.

Вы не можете сравнить число со строкой, как оказалось.И так как я отлаживал от Zappa tail - начиная с 5 м, я часто оказывался, глядя на неправильный материал.

Так что я был прав, код работает, я не сумасшедший и не должен былкод, когда я очень устал.

...