web-dev-qa-db-fra.com

Comment interroger AWS DynamoDB en python?

Je suis relativement nouveau sur NoSQL et utilise AWS DynamoDB. Je l'appelle depuis AWS Lambda en utilisant python 2.7 J'essaie de récupérer une valeur dans un champ 'order_number'.
Voici à quoi ressemble ma table (avoir un seul enregistrement.):
enter image description here

clé de partition primaire: ID_abonnement enter image description here


et mon index global secondaire: order_number
enter image description here

Ma configuration est-elle correcte? Si c'est le cas, étant donné le numéro de commande, comment puis-je récupérer l'enregistrement à l'aide de python?
Je ne peux pas comprendre la syntaxe pour le faire.

J'ai essayé

response = table.get_item( Key = {'order_number': myordernumber} )

Mais je reçois:
Une erreur s'est produite (ValidationException) lors de l'appel de l'opération GetItem: l'élément clé fourni ne correspond pas au schéma: ClientError

13
altoids

DynamoDB n'indexe pas automatiquement tous les champs de votre objet. Par défaut, vous pouvez définir une clé de hachage (subscription_id dans votre cas) et, éventuellement, une clé de plage et celles-ci seront indexées. Vous pouvez donc faire ceci:

response = table.get_item(Key={'subscription_id': mysubid})

et cela fonctionnera comme prévu. Cependant, si vous souhaitez récupérer un élément basé sur order_number vous devez utiliser une opération scan qui examine tous les éléments de votre table pour trouver celui (s) avec la valeur correcte. Il s'agit d'une opération très coûteuse. Ou vous pouvez créer un index secondaire global dans votre table qui utilise order_number comme clé primaire. Si vous avez fait cela et appelé le nouvel index order_number-index vous pouvez alors rechercher des objets qui correspondent à un numéro de commande spécifique comme ceci:

from boto3.dynamodb.conditions import Key, Attr

response = table.query(
    IndexName='order_number-index',
    KeyConditionExpression=Key('order_number').eq(myordernumber))

DynamoDB est une base de données très rapide, évolutive et efficace, mais elle nécessite beaucoup de réflexion sur les champs sur lesquels vous souhaitez rechercher et comment le faire efficacement.

La bonne nouvelle est que vous pouvez maintenant ajouter des GSI à une table existante. Auparavant, vous auriez dû supprimer votre table et tout recommencer.

14
garnaat

Assurez-vous que vous avez importé ceci:

from boto3.dynamodb.conditions import Key, Attr

Si vous ne l'avez pas, vous obtiendrez l'erreur à coup sûr. C'est dans le exemples de documentation .

Merci @altoids pour le commentaire ci-dessus car c'est la bonne réponse pour moi. Je voulais y attirer l'attention par une réponse "formelle".

9
user3303554