2017-10-07 3 views
1

J'essaie de créer par programme une expression FilterExpression en Python pour une requête DynamoDB basée sur les paramètres fournis par l'utilisateur pour un attribut spécifique (appelons-le 'ATTRIBUTE1').DynamoDB Query FilterExpression Conditions multiples de chaînage Python

Tous les paramètres fournis par l'utilisateur pour lesquels je dois filtrer sont dans une liste. Par exemple: ['Parameter1', 'Parameter2']

qui serait alors prendre la forme Attr('ATTRIBUTE1').eq(PARAMETER1)&Attr.('ATTRIBUTE1').eq(PARAMETER2)

Comment puis-je créer un programme Attr pour mon FilterExpression comme celle-ci qui est basé sur un nombre variable de paramètres utilisateur fourni (s)?

Parfois, je pourrais avoir ['Parameter1'] et une autre fois que je pourrais avoir ['Parameter1', 'Parameter2', 'Parameter3'] qui doivent se transformer en Attr('ATTRIBUTE1').eq('Parameter1') et Attr('ATTRIBUTE1').eq('Parameter1')&Attr('ATTRIBUTE1').eq('Parameter2')&Attr('ATTRIBUTE1').eq('Parameter3'), respectivement.

Je n'ai pas encore trouvé de solution et j'apprécierais toute aide. Merci d'avance.

Répondre

1

Combinaison de FilterExpression sous forme de chaîne et ExpressionAttributeValues ​​peut fonctionner, considérez l'exemple suivant:

attrs = ["attribute1", "attribute2", "attribute3"] 
user_input = ["parameter1", "paramater2", "parameter3"] 
ExpressionAttributeValues = {} 
FilterExpression = ""; 
for index, input in enumerate(attrs): 
    if(len(attrs)-1 == index): FilterExpression += input+"=:"+input 
    else: FilterExpression += input+" = :"+input + " AND "; 

for index, input in enumerate(user_input): 
    AttrName = ":" + attrs[index] 
    ExpressionAttributeValues[AttrName] = { 
     "S" : input 
    } 

print(ExpressionAttributeValues) 
print(FilterExpression) 

vous pouvez utiliser ces deux dans votre requête, plus ici http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#client

+0

Merci ce qui est excellent. Comme question de suivi, j'aimerais filtrer la requête si un attribut (pas la clé de partition ou de tri) est supérieur à x et inférieur à y. J'obtiens l'erreur suivante en essayant ceci et ai essayé un tas de différentes solutions sans succès: 'FilterExpression invalide: Type d'opérande incorrect pour l'opérateur ou la fonction; opérateur ou fonction:> =, type d'opérande: M: 'My FilterExpression et ExpressionAttributeValues ​​comme suit:' FilterExpression = 'ATTRIBUTE> =: x ET ATTRIBUTE <=: y'' 'ExpressionAttributeValues ​​= {': x ': {' N ' : '100'}, ': y': {'N': '1000'}} '. Merci! – listentoreason

+0

Vous essayez d'utiliser ces opérateurs sur un attribut de carte, c'est pourquoi vous obtenez cette erreur. Cela devrait fonctionner 'ExpressionAttributeValues ​​= {': x': 100, ': y': 1000}' – ozbey

+0

Merci beaucoup pour l'aide - Je l'ai mis en marche, et j'ai beaucoup appris sur les requêtes DynamoDB. Merci encore. – listentoreason