DynamoDB查询FilterExpression多条件链接Python

问题描述 投票:2回答:3

我正在尝试以编程方式在Python中为DynamoDB查询创建一个FilterExpression,该查询基于用户为特定属性提供的参数(让我们称之为'ATTRIBUTE1')。

我需要过滤的所有用户提供的参数都在列表中。例如:['Parameter1', 'Parameter2']

然后采取形式Attr('ATTRIBUTE1').eq(PARAMETER1)&Attr.('ATTRIBUTE1').eq(PARAMETER2)

我如何以编程方式为我的FilterExpression创建一个Attr,如上所述,它基于不断变化的用户提供的参数数量?

有时我可能有['Parameter1'],而另一次我可能有['Parameter1', 'Parameter2', 'Parameter3'],需要分别变成Attr('ATTRIBUTE1').eq('Parameter1')Attr('ATTRIBUTE1').eq('Parameter1')&Attr('ATTRIBUTE1').eq('Parameter2')&Attr('ATTRIBUTE1').eq('Parameter3')

我还没有找到解决方案,并希望得到任何指导。提前致谢。

python amazon-web-services amazon-dynamodb boto3
3个回答
1
投票

可以使用字符串形式的FilterExpression和ExpressionAttributeValues的组合,请考虑以下示例:

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)

那么你可以在你的查询中使用这两个,更多关于这里http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#client


1
投票

您可以尝试以下方法。我运行查询参数循环来构建dynamodb条件。

    if event.get('queryStringParameters'):
        query_params = event.get('queryStringParameters')
        for query_param, value in query_params.items():
            if query_param == 'attribute1':
                filter_expression_list.append(Attr('attribute1').gte(value))
            if query_param == 'attribute2':
                filter_expression_list.append(Attr('attribute2').eq(value))
            if query_param == 'attribute3':
                filter_expression_list.append(Attr('attribute3').eq(value))
    FilterExpression = None
    if len(filter_expression_list) > 1:
        FilterExpression = And(*filter_expression_list)
    elif len(filter_expression_list) == 1:
        FilterExpression = filter_expression_list[0]

更新:

可以使用以下代码来获取过滤器表达式。这将处理2个或2个以上表达式的情况

def get_filter_expression(filter_expression_list):
    filter_expression = None
    first = True
    for filter in filter_expression_list:
        if first:
            filter_expression = filter
            first = False
        else:
            filter_expression = filter_expression & filter
    return filter_expression

0
投票

紧凑的Pythonic方法可能是管理字典中的条件,避免循环以支持理解,并使用字符串格式方法:

criteria = {'my_key1': 'my_value1', 'my_key2': 'my_value2'}
FilterExpression = ' AND '.join(['{0}=:{0}'.format(k) for k, v in criteria.items()])
ExpressionAttributeValues = {':{}'.format(k): {'S': v} for k, v in criteria.items()}
© www.soinside.com 2019 - 2024. All rights reserved.