我无法在我的dynamodb扫描调用中获得IN
条件才能正常工作。
我正在尝试根据与此相关的角色,根据此数据结构收集用户拥有的所有权限:
# Users
| user | roles
| admin | ['system-admin', 'basic-user']
# Roles
| role | permissions
| system-admin | ['MANAGE_USERS', 'DELETE_MODULES']
client.scan(TableName='Roles',
FilterExpression='#attr IN(:user_roles)',
ExpressionAttributeNames= {
'#attr': 'role',
'#target': 'permissions'
},
ExpressionAttributeValues={
':user_roles': {'SS': ['system-admin', 'test']}
},
ProjectionExpression='#target')['Items']
此扫描不会返回任何项目。我的期望是:
[{'permissions': {'SS': ['DELETE_MODULES', 'MANAGE_USERS']}}]
我只能通过将AttributeValues更改为
来实现':user_roles': {'S': 'system-admin'}
我是否错误地使用了IN条件,或者它实际上无法将字符串设置为参数?
答案 0 :(得分:0)
有趣的是,我发现使用boto3资源API而不是较低级别的客户端它实际上是有效的。但是我仍然很好奇原始代码的问题是什么。
dynamodb = boto3.resource('dynamodb')
roles_table = dynamodb.Table('Roles')
target_user_permissions = roles_table.scan(
FilterExpression=Attr('role').is_in(['system-admin', 'test']),
ExpressionAttributeNames= {
'#target': 'permissions'
},
ProjectionExpression='#target')['Items']