#amazon-dynamodb #boto3
#amazon-dynamodb #boto3
Вопрос:
У меня есть таблица DynamoDB, вызываемая mydb
в формате ниже, где id
указан ключ раздела. Другими атрибутами этой таблицы являются Name, timestamp, Address and Sex
. И мои контейнеры DB насчитывают 10 000 записей.
Теперь я хотел бы выбрать определенные атрибуты, такие как Id, Name and Address
, поэтому я следую этим шагам, но ни один из них не показывает мне конкретные атрибуты. Может кто-нибудь указать, как это исправить?
dynamodb_client = boto3.client('dynamodb', region_name='eu-west-1')
paginator = dynamodb_client.get_paginator('query')
Шаг 1 :
for page in paginator.paginate(TableName='mydb',
Select='SPECIFIC_ATTRIBUTES',
AttributesToGet=[
'Id',
'Address',
'Name'
]):
....
жалуется botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the Query operation: Either the **KeyConditions** or **KeyConditionExpression** parameter must be specified in the request.
на то, что я подумал, что это имеет смысл, и поэтому я перешел к шагу 2.
Шаг 2: поскольку для моего запроса нет условий, необходимых. Я подумал, что добавление условия id >= 1
поможет. Потому Id
что в моей таблице начинается с 1 и продолжает увеличиваться.
for page in paginator.paginate(TableName='mydb',
Select='SPECIFIC_ATTRIBUTES',
AttributesToGet=[
'Id',
'Name',
'Address'
],
KeyConditions={
'Id': {
'AttributeValueList': [{"N": str(1)}],
'ComparisonOperator': 'GE'
}
}):
......
Now, it throws me `botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the Query operation: Query key condition not supported`
Теперь я не понимаю, я добавил KeyConditions
, потому что на шаге 1 предлагается добавить любой из них.
Итак, что я делаю не так и как это исправить?
Ответ №1:
В сообщении об ошибке сообщается, что проблема заключается when calling the Query operation
в следующем. Действительно, Query
операция — это операция, используемая для сканирования только одного раздела, и для нее требуется ключ этого раздела с KeyConditions
KeyConditionExpression
параметром или. Но вы не хотите сканировать отдельный раздел, вы хотите сканировать всю таблицу. Таким образом, вам нужно использовать Scan
операцию, а не Query
.
Итак, вам нужно передать scan
, а не query
в paginator, и все должно (надеюсь) работать так, как вы ожидали.