2

J'utilise Lambda (Python) pour interroger ma base de données DynamoDB. J'utilise la bibliothèque boto3, et je suis en mesure de faire un "équivalent" requête:AWS DynamoDB Python - boto3 Les méthodes Key() non reconnues (Query)

Ce script fonctionne:

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

def create_list(event, context): 
    resource = boto3.resource('dynamodb') 
    table = resource.Table('Table_Name') 

    response = table.query(
     TableName='Table_Name', 
     IndexName='Custom-Index-Name', 
     KeyConditionExpression=Key('Number_Attribute').eq(0) 
    ) 
    return response 

Cependant, quand je change l'expression de requête à ceci:

KeyConditionExpression=Key('Number_Attribute').gt(0) 

Je reçois l'erreur:

"errorType": "ClientError", 
    "errorMessage": "An error occurred (ValidationException) when calling the Query operation: Query key condition not supported" 

Selon cette ressource [1], "gt" est une méthode de clé(). Est-ce que quelqu'un sait si cette bibliothèque a été mise à jour, ou quelles sont les autres méthodes disponibles autres que "eq"?

[1] http://boto3.readthedocs.io/en/latest/reference/customizations/dynamodb.html#ref-dynamodb-conditions

EDIT ---------- ---------

Je viens aussi essayé l'ancienne méthode utilisant:

response = client.query(
     TableName = 'Table_Name', 
     IndexName='Custom_Index', 
     KeyConditions = { 
      'Custom_Number_Attribute':{ 
       'ComparisonOperator':'EQ', 
       'AttributeValueList': [{'N': '0'}] 
      } 
     } 
    ) 

Cela a fonctionné, mais lorsque je tente:

response = client.query(
      TableName = 'Table_Name', 
      IndexName='Custom_Index', 
      KeyConditions = { 
       'Custom_Number_Attribute':{ 
        'ComparisonOperator':'GT', 
        'AttributeValueList': [{'N': '0'}] 
       } 
      } 
     ) 

... cela ne fonctionne pas. Pourquoi l'EQ serait-elle la seule méthode qui fonctionnerait dans ces cas? Pourquoi? Je ne suis pas sûr de ce qui me manque dans la documentation.

+0

supposons faire référence à cette documentation: http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#DynamoDB.Client.query – mootmoot

Répondre

3

D'après ce que je pense: La clé de votre partition est Number_Attribute, et donc vous ne pouvez pas faire un gt lorsque vous faites un query (vous pouvez faire une eq et est-il.)

Vous pouvez faire un gt ou between pour votre clé de tri lorsque vous faites un query. Il est aussi appelé clé Range, et parce qu'il « intelligemment » met les éléments à côté de l'autre, il offre la possibilité de faire gt et between efficacement dans un query

Maintenant, si vous voulez faire un between à votre partition Key, alors vous devrez utiliser scan comme ci-dessous:

Key('Number_Attribute').gt(0) 
response = table.scan(
    FilterExpression=fe 
) 

Gardez à l'esprit les éléments suivants concernant l'analyse:

The scan method reads every item in the entire table, and returns all of the data in the table. You can provide an optional filter_expression, so that only the items matching your criteria are returned. However, note that the filter is only applied after the entire table has been scanned.

en d'autres termes, il est un peu d'une opération coûteuse comparant à la requête. Vous pouvez voir un exemple dans la documentation here.

Espérons que ça aide!

+1

Désolé pour le retard, j'ai reçu la même réponse de AWS Support. Vous avez tout à fait raison, 'eq' est requis sur la clé primaire. La façon dont je résous ce problème consiste à toujours ajouter un attribut à chaque table qui contient la même valeur pour toutes les entrées que je veux interroger.De cette façon, je peux mener la requête, et aussi avoir la possibilité de supprimer des éléments de l'accessibilité (en changeant la valeur de cet attribut général) pour une requête générale. De cette façon, il est similaire à un scan, mais donne un peu plus d'options. – Feedslant