2016-12-13 6 views
1

MongoDB接続ハンドラを実装しようとしていますが、Database呼び出しがMongoClient()コール成功した。MongoClient()は成功しましたが、データベース(MongoClient()、dbName)はNoneTypeを返します

#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)への呼び出し失敗する。

答えて

1

は、__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() 

何をやっていることはあなたがあなたの最後のコメントについて詳しく説明でし

+0

かかわらやるべき何かである場合、私は知らないのですか?あなたがやっていることがあなたがしなければならないことであるかどうかわかりません。 – MrDuk

+0

@MrDuk一般に、あなたはあなたのアプリケーションで 'Database'インスタンスを操作したくありません。必要なものが*接続ハンドラ*であれば、関数を使う方が効率的です。 – styvane

関連する問題