dynamodb扫描不适用于IN条件

时间:2018-01-20 13:47:13

标签: amazon-dynamodb boto3

我无法在我的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条件,或者它实际上无法将字符串设置为参数?

1 个答案:

答案 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']