当连接出现问题时,pymongo 4.10 异步客户端似乎不会引发异常。
取自文档,没有任何本地运行的 mongo DB 的测试结果:
>>> import asyncio
>>> from pymongo import AsyncMongoClient
>>> client = AsyncMongoClient('mongodb://localhost:27017/')
>>> asyncio.run(client.aconnect())
# no errors
激活调试日志时,我看到连接被拒绝,但我预计会引发异常。
>>> import logging
>>> logging.basicConfig(level='DEBUG')
>>> asyncio.run(client.aconnect())
DEBUG:asyncio:Using selector: KqueueSelector
DEBUG:pymongo.topology:{"topologyId": {"$oid": "676020be62e71d3fe6f27721"}, "serverHost": "localhost", "serverPort": 27017, "awaited": false, "durationMS": 2.786167000522255, "failure": "\"AutoReconnect('localhost:27017: [Errno 61] Connection refused (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')\"", "message": "Server heartbeat failed"}
我希望 DEBUG 日志错误是一个例外。我是否误解了异步客户端的某些内容?
mongo 客户端在后台使用连接池等,即使您告诉它显式连接(为什么?),它也不会引发连接失败的异常,直到您实际尝试从数据库读取或写入数据库为止。
但是您可以检查它是否/在哪里连接:
>>> list(client.nodes)
[('10.0.0.1', 27017)]
如果
aconnect
失败,结果将是一个空列表。
但是如果您尝试任何沟通,例如:
>>> await client.server_info()
...你会得到一个例外:
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms), Timeout: 1.9985503089847043s, Topology Description: <TopologyDescription id: 6760281eda9a9980ea35e425, topology_type: Unknown, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')>]>
pymongo 异步驱动程序就是这样构建的..为什么教程告诉你使用
aconnect()
...我不知道。我什至不知道它的存在。
顺便说一句,您可以使用
python -m async
获取 REPL,您可以在其中运行异步命令而无需 asyncio.run()