pymongo 3.2:ConnectionFailure无法正常工作

时间:2015-12-12 19:00:19

标签: python pymongo

当我的代码无法连接到MongoD实例时,我将我的头发拉出来试图让pymongo出错。似乎无论我做什么,' pymongo.errors.ConnectionFailure'不管用。我在localhost和一个远程mongoD实例上试过这个。当我使用来自同一系统的mongoclient shell(' mongo --host xx.xx.xx.xx')时,我得到了正确的拒绝连接#39;其他例外情况正在发挥作用,但不是“ConnectionFailure”。'请注意,当我在mongod实例主机上运行tshark嗅探器时,我在关闭的端口上看到正确的TCP RST以拒绝连接。 Mongod没有收听,但是pymongo ConnectionFailure无法捕获失败的连接。

python版本:2.7.10 pymongo版本:3.2

我可能缺少什么,或者排除故障的步骤?在下面的示例中,mongod未在localhost上运行。我也在远程主机上停止它。在这两个实例中,都没有捕获异常错误,并且pymongo代码似乎认为它已连接。

代码:

import pymongo
try:
    pymongo.MongoClient('localhost:27017')
except pymongo.errors.ConnectionFailure, e:
    print "Could not connect: %s" % e

4 个答案:

答案 0 :(得分:3)

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不会返回有价值的响应来帮助连接状态,因此效果很好。

答案 1 :(得分:2)

在使用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())

答案 2 :(得分:0)

首次尝试:语法错误

您的代码中出现语法错误。变化:

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)

阅读Pymongo3 migration guide

我认为这种行为符合要求,因为guide告诉:

  

在PyMongo 3中,MongoClient构造函数不再阻塞   连接到服务器或服务器,它不再提高   ConnectionFailure如果不可用,ConfigurationError如果不可用   用户的凭据错误。相反,构造函数返回   立即启动后台线程上的连接过程。   添加connect选项以控制这些线程是否为   立即开始,或首次使用客户端时。

如迁移指南所示,这样的事情应该有效:

from pymongo.errors import ConnectionFailure
client = MongoClient(connect=False)
try:
    result = client.admin.command("ismaster")
except ConnectionFailure:
    print("Server not available")

答案 3 :(得分:0)

这似乎仅在我添加两行以获取数据库并进行身份验证时才有效。我不知道为什么。 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主机打印:

'连接失败:host.db.com:27017:[Errno 61]拒绝连接'