gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:11:47 24 4
gpt4 key购买 nike

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

对于使用 Python 的 couchdb 模块时如何加载/同步设计文档,官方有什么建议吗?

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

Writing views in Python”的文档只有 5 句话,实际上只是解释了如何安装 couchpy。关于project's google code site ,提到了一个 couchdb.design 模块,听起来可能有帮助,但没有文档(我可以找到)。该模块的源代码表明它完成了我感兴趣的大部分工作,但它没有实际加载文件。我认为我应该进行某种模块发现,但我听说那是非 Pythonic 的。有什么建议吗?

编辑:

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

最佳答案

这是一种看似合理的方法。首先,我将 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. 组织。所有设计/ View 都作为模块/类(分别)存在于单个包中。
  2. 真实代码。我的文本编辑器将突出显示语法。我可以针对我的 map/reduce 函数编写单元测试。

ViewDefinition子类也可以用来查询。

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

它仍未准备好投入生产,但我认为与在字符串文字中存储 map/reduce 函数相比,这已经向前迈进了一大步。

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

关于python - 在 Python 中加载 CouchDB 设计文档的推荐方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10707814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com