我想在创建新角色之前检查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
答案 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