检查 MongoDB 数据库实例是否为副本集
Check MongoDB database instance is a replica set
我正在为使用事务的函数编写测试。
Transactions only work on replica sets or mongos:
pymongo.errors.OperationFailure: Transaction numbers are only allowed on a replica set member or mongos, full error: {'ok': 0.0, 'errmsg': 'Transaction numbers are only allowed on a replica set member or mongos', 'code': 20, 'codeName': 'IllegalOperation'}
如果数据库是独立的 mongod 实例,我希望跳过这些测试。
如何从 Python 代码(例如使用 pymongo 函数)检查我使用的环境是否合适?
我可以将 CI 管道配置为使用副本集。我可以并且确实在我的机器上配置了它。但我不希望这几个测试成为潜在贡献者的麻烦,所以我宁愿跳过它们。
或者,我可以通过匹配字符串来捕获 OperationFailure
并尝试确保它正是上面的错误,而不是另一个 OperationFailure
,但这将是一个遗憾的解决方法。
也许我可以使用类似
的东西
MongoClient('localhost', 27017).admin.command("replSetGetStatus")
在进行艰难的试错之前,我很乐意得到明智的建议。
这是我想出的:
def is_replica_set():
try:
pymongo.MongoClient().admin.command("replSetGetStatus")
return True
except pymongo.errors.OperationFailure:
return False
@pytest.mark.skipif(not is_replica_set(), reason="Replica set required")
def test_transaction():
...
发送{ismaster: 1}
命令并按照规则here解析响应。
副本集节点将在响应中设置 setName
字段。
这是一种检查 MongoDB 实例是否为副本集的方法:
每个mongod
实例都有自己的local数据库(local
是数据库名称),它存储复制过程中使用的数据,以及其他实例特定的数据。 local
数据库中的 system.replset
集合将副本集的配置对象作为其单个文档保存。
要查看此配置,请从 mongo
shell 发出 rs.conf()
。你也可以直接查询这个集合(见下面方法中使用的代码)。
client = pymongo.MongoClient(url)
collection = client.local.system.replset
try:
doc = collection.find()[0]
print(doc['_id'])
return True
except Exception as e:
print("local.system.replset doesn't exist: " + str(e))
return False
请注意,如果游标为空,即当 local
数据库中不存在 system.replset
集合并且查询失败(查询失败 独立实例)。
在代码中,doc['_id']
是副本集名称。
我正在为使用事务的函数编写测试。
Transactions only work on replica sets or mongos:
pymongo.errors.OperationFailure: Transaction numbers are only allowed on a replica set member or mongos, full error: {'ok': 0.0, 'errmsg': 'Transaction numbers are only allowed on a replica set member or mongos', 'code': 20, 'codeName': 'IllegalOperation'}
如果数据库是独立的 mongod 实例,我希望跳过这些测试。
如何从 Python 代码(例如使用 pymongo 函数)检查我使用的环境是否合适?
我可以将 CI 管道配置为使用副本集。我可以并且确实在我的机器上配置了它。但我不希望这几个测试成为潜在贡献者的麻烦,所以我宁愿跳过它们。
或者,我可以通过匹配字符串来捕获 OperationFailure
并尝试确保它正是上面的错误,而不是另一个 OperationFailure
,但这将是一个遗憾的解决方法。
也许我可以使用类似
的东西MongoClient('localhost', 27017).admin.command("replSetGetStatus")
在进行艰难的试错之前,我很乐意得到明智的建议。
这是我想出的:
def is_replica_set():
try:
pymongo.MongoClient().admin.command("replSetGetStatus")
return True
except pymongo.errors.OperationFailure:
return False
@pytest.mark.skipif(not is_replica_set(), reason="Replica set required")
def test_transaction():
...
发送{ismaster: 1}
命令并按照规则here解析响应。
副本集节点将在响应中设置 setName
字段。
这是一种检查 MongoDB 实例是否为副本集的方法:
每个mongod
实例都有自己的local数据库(local
是数据库名称),它存储复制过程中使用的数据,以及其他实例特定的数据。 local
数据库中的 system.replset
集合将副本集的配置对象作为其单个文档保存。
要查看此配置,请从 mongo
shell 发出 rs.conf()
。你也可以直接查询这个集合(见下面方法中使用的代码)。
client = pymongo.MongoClient(url)
collection = client.local.system.replset
try:
doc = collection.find()[0]
print(doc['_id'])
return True
except Exception as e:
print("local.system.replset doesn't exist: " + str(e))
return False
请注意,如果游标为空,即当 local
数据库中不存在 system.replset
集合并且查询失败(查询失败 独立实例)。
在代码中,doc['_id']
是副本集名称。