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

Mar*_*ase 6 python couchdb

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

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

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

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

编辑:

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

Mar*_*ase 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]
Run Code Online (Sandbox Code Playgroud)

现在,如果我想同步:

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)
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是:

  1. 组织。所有设计/视图都作为模块/类(分别)存在于单个包中。
  2. 真实的代码。我的文本编辑器将突出显示语法。我可以针对我的映射/归约函数编写单元测试。

ViewDefinition子类也可以用于查询。

current_version_view = couchview.version.CurrentVersion()
result = current_version_view(self.db, key=version_key)
Run Code Online (Sandbox Code Playgroud)

它还没有准备好用于生产,但我认为与在字符串文字中存储映射/归约函数相比,这已经向前迈出了一大步。

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