如何使用PyMongo执行getRole命令?MongoDB角色存在性校验报错排查
解决pymongo调用getRole命令报错的问题
嘿,我来帮你搞定这个问题!你遇到的报错是因为**db.getRole()是Mongo Shell的内置方法,并不是可以直接通过pymongo的command()调用的原生数据库命令**——这就是为什么你用createRole能正常执行(它本身就是原生数据库命令),但调用getRole会提示“no such command”。
正确的角色存在性检查方法
你可以用rolesInfo命令来替代,这正是db.getRole()在Shell背后实际调用的命令。下面是具体的代码示例:
from pymongo.errors import OperationFailure def check_role_exists(self, database, app_name): try: # 使用rolesInfo命令查询指定角色 result = self.client[database].command( "rolesInfo", {"role": app_name, "db": database} ) # 如果返回的roles数组不为空,说明角色存在 if result.get("roles", []): return True return False except OperationFailure as e: # 处理权限不足或其他异常 print(f"检查角色时发生错误: {str(e)}") return False # 使用示例 role_exists = check_role_exists(self, database, app_name) if role_exists: print(f"角色 {app_name} 已经存在,无需创建") else: # 执行你的createRole逻辑 self.client[database].command( "createRole", app_name, privileges=[...], # 替换为你的权限配置 roles=[...] # 替换为继承的角色配置 )
另外,你也可以用listRoles命令列出当前数据库的所有角色,再过滤查找:
def check_role_exists(self, database, app_name): roles = self.client[database].command("listRoles")["roles"] return any(role["role"] == app_name for role in roles)
补充说明
Mongo Shell里的很多方法(比如db.getRole()、db.getCollection())都是对原生数据库命令的封装,不能直接通过pymongo的command()方法直接调用。如果以后遇到类似问题,可以先确认该Shell方法对应的原生数据库命令是什么,再用command()调用对应的命令即可。
内容的提问来源于stack exchange,提问作者isset
相关产品推荐
相关产品推荐

