对于未来的读者,这是我们在一天的故障排除后解决此错误的方法。
我有一个Flask项目,使用Python 3.9.6、pymongo 3.12.0、flask 2.0.1和flask-pymongo 2.3.0连接到MongoDb。
我的连接字符串看起来像这样:mongodb+srv://my_username:my_user@cluster0.abc123.mongodb.net/my_db_name?retryWrites=true&w=majority
我在app.py
中初始化连接的代码如下:
app.config["MONGO_URI"] = "mongodb+srv://my_username:my_user@cluster0.abc123.mongodb.net/my_db_name?retryWrites=true&w=majority"
mongo = PyMongo(app)
db = mongo.db
print("db initialization complete")
在尝试读取或写入数据库时没有成功,但是没有收到任何错误信息,我添加了一个try/except,像这样:
try:
myCollection = db["collectionName"]
result = myCollection.find({})
print("after query", result)
print("after query, again", list(result))
except Exception as err:
print("Error in query_db -> ", err)
然后我能够看到发生的错误。这是由于连接失败造成的超时。
Error in query_db -> cluster0.nt7lk.mongodb.net:27017: [Errno 11001] getaddrinfo failed, Timeout: 30s, Topology Description: <TopologyDescription id: 6124a7768a437d2f7c01cdcf, topology_type: Single, servers: [<ServerDescription ('cluster0.nt7lk.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('cluster0.nt7lk.mongodb.net:27017: [Errno 11001] getaddrinfo failed')>]>
在花费另外一个小时尝试解决这个问题,包括检查Mongo Compass Web Portal上的开放IP地址和端口,确保连接字符串来自“通过应用程序连接”而不是“通过Mongo Compass连接”,以及定义初始化的一千种方式后,我意识到我需要dnspython
软件包才能使用包含srv
的mongo连接字符串。
运行pip install -r dnspython
进行安装。
mongo
shell 连接到 MongoDB? - albertmongod
没有运行,您就没有数据库实例可以连接。连接到不可用主机上的数据库肯定会引发连接错误... - albert