Dynamodb和Boto3,扫描中的链多重条件



我正在寻找一种在Dynamodb中创建具有多个FilterExpression条件的scan请求的方法"与";在一起

例如,我们可以扫描一个";水果";使用此标准的数据库:

criteria = {
'fruit': 'apple', 
'color': 'green',
'taste': 'sweet'
}

我知道这些可以连接成这样的字符串:

FilterExpression = ' AND '.join([f"{k}=:{k}" for k, v in criteria.items()])
ExpressionAttributeValues = {f":{k}": {'S': v} for k, v in criteria.items()}

然而,这似乎不是最优雅/最蟒蛇的方法。

使用reduce,可以实现以下行为:

from functools import reduce
from boto3.dynamodb.conditions import Key, And
FilterExpression=reduce(And, ([Key(k).eq(v) for k, v in criteria.items()]))

希望这对你有用!

老实说,我认为你所拥有的一切都很好,尽管它非常有限。如果你做的事情很简单,这可能是可以接受的。

如果你想使用一个库作为DynamoDB的ORM,让它更容易使用你自己的一组数据类来存储/检索数据,而不需要将其转换为boto响应,你应该查看PynamoDB

最新更新