6

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

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

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

“用 Python 编写视图”的文档是 5 句话,实际上只是解释了如何安装 couchpy。在该项目的谷歌代码站点上,提到了一个 couchdb.design 模块,听起来可能会有所帮助,但没有文档(我可以找到)。该模块的源代码表明它完成了我感兴趣的大部分工作,但实际上没有加载文件。我想我应该做某种模块发现,但我听说那是非 Pythonic。建议?

编辑:

特别是,将我的 map/reduce 函数存储在字符串文字中的想法似乎完全是 hacky。我想用真正的单元测试编写真正的python代码,在一个真正的模块中,在一个真正的包中。定期,我想将我的“沙发视图”包与 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 回答