2012-01-08 80 views
1

我知道這個問題已經被一個或兩個人問過了,但它與我所想的不同。請多多包涵。如何開始在另一個包裝器上編寫python包裝?

我想寫一個包裝現有的couchdb-python包裝。原因是,如果我們決定在將來切換到另一個NoSQL數據庫,例如MongoDB,我只需要更改我的代碼庫的一部分。

問題1:鑑於上述情況,這是建議的正確的行動方案嗎?

訪問數據庫需要使用couchdb-python包裝器訪問couchdb的問題,有時(並非所有時間),用戶名/密碼都是必需的。這就是它看起來像在代碼:

server = Server() <---- When no username/password is required 
server = Server('http://abc:[email protected]:5984') <---- When username/password is required 

我將如何界定inital 初始化功能,以應付這兩種方案。我現在有這樣的想法:

from couchdb import Server 


class Couch(object): 
    """ CouchDB Wrapper """ 
    COUCHDB_URI = {username_not_provided: 'http://localhost:5984', 
        username_provided: 'http://%s:%[email protected]:5984'} 
    def __init__(self, username=None, password=None): 
     if username and password: 
      self.url = COUCHDB_URI['username_provided'] % (username, password) 
     else: 
      self.url = COUCHDB_URI['username_not_provided'] 
     self.server = Server(self.url) 

我覺得代碼看起來很醜,有人能指出我對上述的正確方向嗎?

謝謝大家!我非常感謝幫助。

回答

2

這是從larsmans回答你的具體格式問題的答案,但我認爲你可能想要採取與此不同的方式。首先創建一個爲任何NoSQL後端定義通用接口的Base類可能會更好。例如:

class Database(object): 

    def __init__(self, **kwargs): 
     self.connect(**kwargs) 

    def connect(self, **kwargs): 
     pass 


class Couch(Database): 

    def __init__(**kwargs): 
     super(Couch, self).__init__(**kwargs) 

    def connect(self, username=None, password=None): 
     if username and password: 
      # connect this way 
      pass 
     else: 
      # connect that way 
      pass 

數據庫類將定義子類應實現的所有接口方法。這樣,你的高級代碼就可以假設一個通用的數據庫對象,並且你只需要爲不同的NoSQL後端定義新的模塊。

編輯

你應該看看nonrel Django的:http://www.allbuttonspressed.com/projects/django-nonrel

他們完成Django的這個相同的任務,使用的MongoDB作爲他們的主要選擇,但你可以添加更多的支持通過爲CouchDB實現一些基類。這應該給你一個他們如何完成它的好主意,因爲django是相同的想法,在可交換數據庫後端使用不可知的ORM層。

1

你可以這樣來做:

class Couch(object): 
    URI_TEMPLATE = "http://%slocalhost:5984" 

    def __init__(self, username=None, password=None): 
     if username and password: 
      user_part = "%s:%[email protected]" % (username, password) 
     else: 
      user_part = "" 
     self.url = URI_TEMPLATE % user_part 

雖然這裏的缺點是%s不會在URI模板中脫穎而出。

這恐怕不會比這更漂亮。

+0

感謝您的輸入,但我確實在尋找答案和JDI答案的組合。我想知道是否有可能將觀點授予你們兩個人。 – Mark 2012-01-09 02:23:09