在Python中加载CouchDB设计文档的推荐方法?

时间:2012-05-22 18:22:25

标签: python couchdb

我对沙发很新,但我正在尝试在新的Python项目上使用它,我也想用python来编写设计文档(视图)。我已经将Couch配置为使用了couchpy视图服务器,我可以通过在Futon中输入一些简单的map / reduce函数来确认这是有效的。

在使用Python的couchdb模块时,是否有关于如何加载/同步设计文档的官方建议?

据我所知,我可以发布设计文档,将它们“安装”到Couch中,但我的问题实际上是最佳实践。我需要某种策略来在开发环境和生产环境中进行部署。我的直觉是创建一个目录并在那里存储我的所有设计文档,然后编写某种同步脚本,将每个脚本上传到沙发中(可能只是盲目地覆盖已经存在的内容)。 这是个好主意吗?

Writing views in Python”的文档是5个句子,实际上只是解释了如何安装couchpy。在project's google code site上,提到了一个看起来很有帮助的couchdb.design模块,但是没有文档(我可以找到)。该模块的源代码表明它完成了我感兴趣的大部分内容,但它没有实际加载文件。我想我应该做一些模块发现,但我听说那是非Pythonic。建议?

编辑:

特别是,将map / reduce函数存储在字符串文字中的想法似乎完全hacky 。我想在一个真实的模块中,用真实的单元测试编写真正的python代码。我想定期将我的“沙发视图”包与couchdb实例同步。

1 个答案:

答案 0 :(得分:3)

这是一种看似合理的方法。首先,我将couchdb.design.ViewDefinition子类化。 (为简洁起见,删除了注释和pydoc。)

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函数编写单元测试。
  3. ViewDefinition子类也可用于查询。

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

    它还没有为生产做好准备,但我认为与在字符串文字中存储map / reduce函数相比,这是一个很大的进步。

    编辑:我最后写了几篇关于这个主题的博客文章,因为我找不到任何其他建议来源:

相关问题