我正在寻找一种在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