Dynamodb 和 Boto3,在扫描中链接多个条件
Dynamodb and Boto3, Chain Multiple Conditions in Scan
我正在寻找一种在 Dynamodb 中创建 scan
请求的方法,其中多个 FilterExpression
条件“AND”在一起。
例如,我们可以使用以下条件扫描“水果”数据库:
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()}
然而,这似乎不是最优雅/pythonic 的方法。
老实说,我觉得你那里的东西还不错,虽然它很有限。如果你做的很简单,这可能是可以接受的。
如果您想使用一个库来充当 DynamoDB 的 ORM,以便使用您自己的数据集 类 更轻松地处理 storing/retrieving 数据,而不需要转换in/out 的 boto 回复,你应该查看 PynamoDB
使用 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 中创建 scan
请求的方法,其中多个 FilterExpression
条件“AND”在一起。
例如,我们可以使用以下条件扫描“水果”数据库:
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()}
然而,这似乎不是最优雅/pythonic 的方法。
老实说,我觉得你那里的东西还不错,虽然它很有限。如果你做的很简单,这可能是可以接受的。
如果您想使用一个库来充当 DynamoDB 的 ORM,以便使用您自己的数据集 类 更轻松地处理 storing/retrieving 数据,而不需要转换in/out 的 boto 回复,你应该查看 PynamoDB
使用 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()]))
希望这对你有用!