我对沙发很新,但我正在尝试在新的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实例同步。
答案 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)
这种方法的好处是:
ViewDefinition子类也可用于查询。
current_version_view = couchview.version.CurrentVersion()
result = current_version_view(self.db, key=version_key)
它还没有为生产做好准备,但我认为与在字符串文字中存储map / reduce函数相比,这是一个很大的进步。
编辑:我最后写了几篇关于这个主题的博客文章,因为我找不到任何其他建议来源: