【问题标题】:MongoClient() is successful, but Database(MongoClient(), dbName) returns NoneTypeMongoClient() 成功,但是 Database(MongoClient(), dbName) 返回 NoneType
【发布时间】:2017-04-28 20:04:44
【问题描述】:

我正在尝试实现 MongoDB 连接处理程序,但遇到了一个问题,即我的 Database 调用返回 None,即使我的 MongoClient() 调用成功。

#mongoconn.py

from pymongo import MongoClient
from pymongo.database import Database

class MongoConnection():
    mongoconn = None

    def __init__(self, db=None, collection=None, endpoint=None):
        self.mongodb = db
        self.mongocollection = collection
        self.mongoendpoint = endpoint
        mongoconn = self.__mongo_connect()

    def __mongo_connect(self):
        if self.mongoendpoint is not None: 
            mc = MongoClient(host=self.mongoendpoint, port=27017, document_class=dict, tz_aware=False, connect=True)
            print mc    #successful object
            return Database(mc)
        else: 
            mc = MongoClient(host='localhost', port=27017, document_class=dict, tz_aware=False, connect=True)
            print mc    #successful object
            return Database(mc, self.mongodb)

m1 = MongoConnection("torbot")

print m1.mongoconn    # None

我可以看到这个集合torbot 确实存在,所以我不认为这是问题所在:

MongoDB shell version v3.4.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0
use torbot
switched to db torbot
db.requests.find();
{ "_id" : ObjectId("584f7e17bc1d1b7f37d54756"), "requestor" : "ctote", "request" : "Scott Pilgrim Vs The World" }

但我找不到任何调试选项来了解为什么调用 Database(mc, self.mongodb) 失败。

【问题讨论】:

    标签: python mongodb python-2.7 pymongo


    【解决方案1】:

    mongoconn 是一个类属性,要在__init__ 方法中访问它,您需要在它前面加上类名或self。在您的情况下,您正在执行self.mongoconn 将创建一个可能不是您想要的实例属性,因此您需要的是MongoConnection.mongoconn = self.__mongo_connect()。您的__init__ 方法变为:

    class MongoConnection():
        mongoconn = None
    
        def __init__(self, db=None, collection=None, endpoint=None):
            self.mongodb = db
            self.mongocollection = collection
            self.mongoendpoint = endpoint
            MongoConnection.mongoconn = self.__mongo_connect()
    

    我不知道你正在做的事情是不是你应该做的事情

    【讨论】:

    • 您能否详细说明您的上一条评论? I [don't] know if what you are doing is something you should be doing though
    • @MrDuk 通常你不想在你的应用程序中操作Database 实例。如果您只需要一个连接处理程序,那么使用函数也会更有效。
    猜你喜欢
    • 2020-07-07
    • 2018-03-08
    • 1970-01-01
    • 2019-09-20
    • 2015-07-13
    • 2016-05-10
    • 2018-12-10
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多