6

私はソファに慣れていないのですが、新しいPythonプロジェクトで使用しようとしています。また、Pythonを使用して設計ドキュメント(ビュー)も作成したいと思います。Couchpy Viewサーバーを使用するようにCouchを構成しました。これが機能することを確認するには、Futonにいくつかの簡単なmap/reduce関数を入力します。

Pythonのcouchdbモジュールを使用するときに設計ドキュメントをロード/同期する方法に関する公式の推奨事項はありますか?

設計ドキュメントを投稿してCouchに「インストール」できることは理解していますが、私の質問は実際にはベストプラクティスに関するものです。開発環境と本番環境の両方で展開するには、ある種の戦略が必要です。私の直感は、ディレクトリを作成し、そこにすべての設計ドキュメントを保存してから、それぞれをソファにアップロードするある種の同期スクリプトを作成することです(おそらく、すでに存在するものをやみくもに上書きします)。これは良い考えですか?

「 Pythonでビューを書く」のドキュメントは5文で、実際にはcouchpyのインストール方法を説明しています。プロジェクトのグーグルコードサイトには、役立つかもしれないと思われるcouchdb.designモジュールについての言及がありますが、ドキュメントはありません(私が見つけることができます)。そのモジュールのソースコードは、私が興味を持っていることのほとんどを実行することを示していますが、実際にファイルをロードするには至っていません。ある種のモジュール検出を行う必要があると思いますが、それはPythonicではないと聞いています。助言?

編集:

特に、私のmap/reduce関数を文字列リテラル内に格納するというアイデアは完全にハッキーなようです。実際のPythonコードを、実際のモジュールで、実際のパッケージで、実際の単体テストで記述したいと思います。定期的に、「couchviews」パッケージをcouchdbインスタンスと同期させたいです。

4

1 に答える 1

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関数を格納することと比較して大きな一歩だと思います。

編集:他のアドバイスのソースが見つからなかったので、私は最終的にこのトピックに関するいくつかのブログ投稿を書きました:

于 2012-05-23T15:53:15.310 に答える