pymongo 3.2:ConnectionFailure 不工作
pymongo 3.2: ConnectionFailure not working
当代码无法连接到 MongoD 实例时,我正在努力尝试让 pymongo 出错。似乎无论我做什么 'pymongo.errors.ConnectionFailure' 都不起作用。我在本地主机和远程 mongoD 实例上试过这个。当我从同一系统使用 mongoclient shell ('mongo --host xx.xx.xx.xx') 时,我得到了正确的 'connection refused'。其他异常正在工作,但不是 'ConnectionFailure.' 请注意,当我在 mongod 实例主机上 运行 tshark 嗅探器时,我在关闭的端口上看到正确的 TCP RST 以拒绝连接。 Mongod 没有在监听,但是 pymongo ConnectionFailure 无法捕获失败的连接。
python版本:2.7.10
pymongo 版本:3.2
我可能遗漏了什么,或排除故障的步骤?在下面的这个例子中,mongod 不在本地主机上 运行ning。我也在远程主机上停止它。在这两种情况下,都没有捕获到异常错误,并且 pymongo 代码似乎认为它已连接。
代码:
import pymongo
try:
pymongo.MongoClient('localhost:27017')
except pymongo.errors.ConnectionFailure, e:
print "Could not connect: %s" % e
第一次尝试:语法错误
您的代码中存在语法错误。变化:
pymongo.MongoClient('localhost':27017)
进入:
pymongo.MongoClient('localhost:27017')
或类似这样的内容:
pymongo.MongoClient(host='localhost', port=27017)
你在错误的地方使用了单引号。
使用 Python 3.4.3 和 pymongo 2.9 的工作示例片段
import pymongo
try:
pymongo.MongoClient('localhost:27017')
except pymongo.errors.ConnectionFailure as e:
print(e)
我认为这种行为是合乎需要的,因为 guide 告诉:
In PyMongo 3, the MongoClient constructor no longer blocks while
connecting to the server or servers, and it no longer raises
ConnectionFailure
if they are unavailable, nor ConfigurationError
if
the user’s credentials are wrong. Instead, the constructor returns
immediately and launches the connection process on background threads.
The connect option is added to control whether these threads are
started immediately, or when the client is first used.
如迁移指南中所示,这样的事情应该可行:
from pymongo.errors import ConnectionFailure
client = MongoClient(connect=False)
try:
result = client.admin.command("ismaster")
except ConnectionFailure:
print("Server not available")
这似乎只有在我添加两行以获取数据库并进行身份验证时才有效。我不知道为什么。 ConnectionFailure 不应该只在您尝试连接时捕获错误吗?
try:
dbconn = pymongo.MongoClient(host, port)
db = dbconn[dbname]
success = db.authenticate(user, password)
except pymongo.errors.ConnectionFailure as msg:
print "Failed connection: %s" % str(msg)
当我在不是 运行 mongod 的主机上用嗅探器观察这个时,它会尝试连接 20-30 秒,然后 pymongo 主机打印:
'Failed connection: host.db.com:27017: [Errno 61] Connection refused'
def dbConnect():
try:
conn = pymongo.MongoClient(<connection URL>)
try:
conn.server_info()
return "Connection Successfull"
except OperationFailure as e:
return e
except Exception as e:
return e
print (dbConnect())
由于 MongoClient 没有 return 有助于连接状态的有价值的响应,因此可以正常工作。
我在使用pymongo.MongoClient()
时也遇到了这个问题。
试试下面的代码,它可能对你有帮助:
def initiateDbConnection():
try:
dbConnection= pymongo.MongoClient(<connection URL>)
try:
dbConnection.server_info()
return "Connection Established"
except OperationFailure as err:
return err
except Exception as err:
return err
print (initiateDbConnection())
对于那些以后来的人,经过一天的故障排除,这就是我们解决这个错误问题的方法
我有一个 Flask 项目,使用 Python 3.9.6、pymongo 3.12.0、flask 2.0.1 和 flask-py[= 连接到 MongoDb 39=]2.3.0.
我的连接字符串如下所示: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({}) # returns all documents
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 门户网站上开放的 IP 地址和端口,确保连接字符串来自 'Connect via Application' 而不是 'Connect via Mongo Compass',以及一千种定义初始化的方法,我意识到我需要 dnspython
包才能使用 mongo 包含 srv
的连接字符串。
运行 pip install -r dnspython
安装它。
当代码无法连接到 MongoD 实例时,我正在努力尝试让 pymongo 出错。似乎无论我做什么 'pymongo.errors.ConnectionFailure' 都不起作用。我在本地主机和远程 mongoD 实例上试过这个。当我从同一系统使用 mongoclient shell ('mongo --host xx.xx.xx.xx') 时,我得到了正确的 'connection refused'。其他异常正在工作,但不是 'ConnectionFailure.' 请注意,当我在 mongod 实例主机上 运行 tshark 嗅探器时,我在关闭的端口上看到正确的 TCP RST 以拒绝连接。 Mongod 没有在监听,但是 pymongo ConnectionFailure 无法捕获失败的连接。
python版本:2.7.10 pymongo 版本:3.2
我可能遗漏了什么,或排除故障的步骤?在下面的这个例子中,mongod 不在本地主机上 运行ning。我也在远程主机上停止它。在这两种情况下,都没有捕获到异常错误,并且 pymongo 代码似乎认为它已连接。
代码:
import pymongo
try:
pymongo.MongoClient('localhost:27017')
except pymongo.errors.ConnectionFailure, e:
print "Could not connect: %s" % e
第一次尝试:语法错误
您的代码中存在语法错误。变化:
pymongo.MongoClient('localhost':27017)
进入:
pymongo.MongoClient('localhost:27017')
或类似这样的内容:
pymongo.MongoClient(host='localhost', port=27017)
你在错误的地方使用了单引号。
使用 Python 3.4.3 和 pymongo 2.9 的工作示例片段
import pymongo
try:
pymongo.MongoClient('localhost:27017')
except pymongo.errors.ConnectionFailure as e:
print(e)
我认为这种行为是合乎需要的,因为 guide 告诉:
In PyMongo 3, the MongoClient constructor no longer blocks while connecting to the server or servers, and it no longer raises
ConnectionFailure
if they are unavailable, norConfigurationError
if the user’s credentials are wrong. Instead, the constructor returns immediately and launches the connection process on background threads. The connect option is added to control whether these threads are started immediately, or when the client is first used.
如迁移指南中所示,这样的事情应该可行:
from pymongo.errors import ConnectionFailure client = MongoClient(connect=False) try: result = client.admin.command("ismaster") except ConnectionFailure: print("Server not available")
这似乎只有在我添加两行以获取数据库并进行身份验证时才有效。我不知道为什么。 ConnectionFailure 不应该只在您尝试连接时捕获错误吗?
try:
dbconn = pymongo.MongoClient(host, port)
db = dbconn[dbname]
success = db.authenticate(user, password)
except pymongo.errors.ConnectionFailure as msg:
print "Failed connection: %s" % str(msg)
当我在不是 运行 mongod 的主机上用嗅探器观察这个时,它会尝试连接 20-30 秒,然后 pymongo 主机打印:
'Failed connection: host.db.com:27017: [Errno 61] Connection refused'
def dbConnect():
try:
conn = pymongo.MongoClient(<connection URL>)
try:
conn.server_info()
return "Connection Successfull"
except OperationFailure as e:
return e
except Exception as e:
return e
print (dbConnect())
由于 MongoClient 没有 return 有助于连接状态的有价值的响应,因此可以正常工作。
我在使用pymongo.MongoClient()
时也遇到了这个问题。
试试下面的代码,它可能对你有帮助:
def initiateDbConnection():
try:
dbConnection= pymongo.MongoClient(<connection URL>)
try:
dbConnection.server_info()
return "Connection Established"
except OperationFailure as err:
return err
except Exception as err:
return err
print (initiateDbConnection())
对于那些以后来的人,经过一天的故障排除,这就是我们解决这个错误问题的方法
我有一个 Flask 项目,使用 Python 3.9.6、pymongo 3.12.0、flask 2.0.1 和 flask-py[= 连接到 MongoDb 39=]2.3.0.
我的连接字符串如下所示: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({}) # returns all documents
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 门户网站上开放的 IP 地址和端口,确保连接字符串来自 'Connect via Application' 而不是 'Connect via Mongo Compass',以及一千种定义初始化的方法,我意识到我需要 dnspython
包才能使用 mongo 包含 srv
的连接字符串。
运行 pip install -r dnspython
安装它。