如何使用pymongo运行getRole命令?

时间:2018-01-31 14:37:04

标签: mongodb python-3.x pymongo

我想在创建新角色之前检查mongodb中是否存在角色。我尝试按以下方式进行:

result = self.client[database].command("getRole", name=app_name)

不幸的是我收到以下错误:

msg = msg or "%s"
raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: no such command: 'getRole', bad cmd: '{ getRole: 1, name: "test" }'

我指的是这个数据库命令:https://docs.mongodb.com/manual/reference/method/db.getRole/

对于createRole,我可以执行命令:https://docs.mongodb.com/manual/reference/method/db.createRole/#db.createRole

1 个答案:

答案 0 :(得分:1)

Shell methods db.*Database commands不同。

使用roleInfo command,您可以获取特定角色的信息。

db.command({
    'rolesInfo': {'role': 'noremove','db': 'test'},
    'showPrivileges': True, 'showBuiltinRoles': True
})

当匹配的角色时,上述命令以形式返回结果:

{'ok': 1.0,
 'roles': [{'db': 'test',
   'inheritedPrivileges': [{'actions': ['find', 'insert', 'update'],
     'resource': {'collection': 'test', 'db': 'test'}}],
   'inheritedRoles': [],
   'isBuiltin': False,
   'privileges': [{'actions': ['find', 'insert', 'update'],
     'resource': {'collection': 'test', 'db': 'test'}}],
   'role': 'noremove',
   'roles': []}]}

如果没有匹配的角色,您会收到以下结果:

{'ok': 1.0, 'roles': []}

检查角色是否存在属于检查"角色的长度"在返回的结果中列出如下:

noremove_role = db.command({
    'rolesInfo': {'role': 'noremove','db': 'test'},
    'showPrivileges': True, 'showBuiltinRoles': True
})

if not len(noremove_role['roles']):
    # create role
    pass

有更好的方法吗?

是的,与请求宽恕而非许可理念一致,创建角色并处理尝试添加现有角色的结果异常。

from pymongo.errors import DuplicateKeyError
import logging

logger = logging.getLogger()

try:
    db.command(
        'createRole', 'noremove',
        privileges=[{
            'actions': ['insert', 'update', 'find'],
            'resource': {'db': 'test', 'collection': 'test'}
        }],
        roles=[])
except DuplicateKeyError:
    logger.error('Role already exists.')
    pass