2012-05-22 51 views
6

我對沙發很陌生,但我試圖在一個新的Python項目中使用它,並且我還想用python來編寫設計文檔(視圖)。我已經配置Couch來使用couchpy視圖服務器,並且我可以通過在蒲團中輸入一些簡單的map/reduce函數來確認這個工作。推薦使用Python加載CouchDB設計文檔的方法嗎?

沒有關於如何使用Python的CouchDB的模塊時加載/同步設計文件的任何正式建議?

我明白,我可以發佈的設計文件,它們「安裝」到沙發,但我的問題是真的各地的最佳實踐。我需要在開發環境和生產環境中部署某種策略。我的直覺是創建一個目錄並將所有設計文檔存儲在那裏,然後編寫一些同步腳本,將每個腳本上傳到沙發上(可能只是盲目覆蓋已有的內容)。 這是個好主意嗎?

Writing views in Python」的文檔是5個句子,並且只是解釋瞭如何安裝couchpy。在project's google code site上,提到了一個couchdb.design模塊,聽起來可能有所幫助,但沒有任何文檔(我可以找到)。該模塊的源代碼表明它完成了我感興趣的大部分工作,但它沒有實際加載文件。我想我應該做一些模塊發現,但我聽說這是非Pythonic。建議嗎?

編輯:

特別是儲存我的地圖的想法/減少字符串字面內部功能似乎完全哈克。我想用實際的單元測試在實際的模塊中編寫真正的Python代碼,並使用真正的包來編寫代碼。定期地,我想將我的「沙發視圖」包與一個couchdb實例同步。

回答

3

這是一種看起來合理的方法。首先,我繼承了couchdb.design.ViewDefinition。 (評論和pydocs爲簡潔移除。)現在

import couchdb.design 
import inflection 

DESIGN_NAME="version" 

class CurrentVersion(couchdb.design.ViewDefinition): 
    def __init__(self): 

     map_fun = self.__class__.map 

     if hasattr(self.__class__, "reduce"): 
      reduce_fun = self.__class__.reduce 
     else: 
      reduce_fun = None 

     super_args = (DESIGN_NAME, 
         inflection.underscore(self.__class__.__name__), 
         map_fun, 
         reduce_fun, 
         'python') 

     super(CurrentVersion, self).__init__(*super_args) 

    @staticmethod 
    def map(doc): 
     if 'version_key' in doc and 'created_ts' in doc: 
      yield (doc['version_key'], [doc['_id'], doc['created_ts']]) 

    @staticmethod 
    def reduce(keys, values, rereduce): 
     max_index = 0 

     for index, value in enumerate(values): 
      if value[1] > values[max_index][1]: 
       max_index = index 

     return values[max_index] 

,如果我想同步:

import couchdb.design 
from couchview.version import CurrentVersion 

db = get_couch_db() # omitted for brevity 
couchdb.design.ViewDefinition.sync_many(db, [CurrentVersion()], remove_missing=True) 

這種方法的好處是:

  1. 組織。所有設計/視圖都作爲模塊/類(分別)位於一個包中。
  2. 真實碼。我的文本編輯器將突出語法。我可以針對我的map/reduce函數編寫單元測試。

ViewDefinition子類也可用於查詢。

current_version_view = couchview.version.CurrentVersion() 
result = current_version_view(self.db, key=version_key) 

它還沒有準備好生產,但我認爲這比在字符串文字中存儲map/reduce函數更近了一步。

編輯:我終於寫了一篇關於該主題的情侶博客文章,因爲我無法找到建議的任何其它來源: