CouchDB新手求助:如何用Django创建CouchDB设计文档替代临时视图
解决CouchDB 2.x临时视图不支持的问题
嘿,我帮你搞定这个问题!CouchDB 2.0及以后的版本确实移除了临时视图的支持,所以你原来用db.query()直接传map函数的方式就会报410 Gone错误。咱们得换成永久视图——也就是把视图函数存在CouchDB的设计文档里,之后查询这个预定义好的视图就行。
核心思路:创建设计文档存放视图
设计文档是CouchDB里专门用来存储视图、索引、展示逻辑的特殊文档,它的_id必须以_design/开头。咱们要把你原来的map函数放进设计文档的views字段里,之后通过视图路径来查询数据。
完整修改后的代码示例
先看替代你原有代码的完整版本:
import couchdb import json # 连接CouchDB服务器和数据库 server = couchdb.Server("你的CouchDB地址") db = server['test'] # 定义包含视图的设计文档 design_doc = { "_id": "_design/count_views", # 必须以_design/开头 "views": { "by_count": { # 视图名称,自定义就行 "map": "function(doc) { emit(doc.count, 1); }" # 你原来的map函数 } } } # 检查设计文档是否存在,不存在就创建,存在则更新 try: # 尝试获取已有的设计文档 existing_doc = db[design_doc['_id']] # 如果map函数有变化,更新文档(这里直接覆盖保存,也可以对比后再更新) existing_doc['views'] = design_doc['views'] db.save(existing_doc) except couchdb.ResourceNotFound: # 文档不存在,创建新的 db.save(design_doc) # 查询永久视图(路径格式:设计文档名/视图名) results = db.view('count_views/by_count') for row in results: i = row.key print("i:", i) dict_data = json.loads(i) # 注意别用dict当变量名,会覆盖Python内置类型
在Django中管理设计文档
如果你要在Django项目里做这件事,推荐通过自定义管理命令来创建/更新设计文档,这样可以方便地和Django的配置集成:
1. 配置CouchDB连接信息
在Django的settings.py里添加CouchDB的配置:
# settings.py COUCHDB_URL = "http://localhost:5984/" # 你的CouchDB地址 COUCHDB_DB_NAME = "test" # 要操作的数据库名
2. 创建自定义管理命令
在你的Django应用下创建management/commands目录(如果没有的话),然后新建create_couchdb_views.py文件:
from django.core.management.base import BaseCommand import couchdb from django.conf import settings class Command(BaseCommand): help = "创建/更新CouchDB的设计文档和视图" def handle(self, *args, **options): # 从配置获取连接信息 server = couchdb.Server(settings.COUCHDB_URL) db = server[settings.COUCHDB_DB_NAME] # 定义设计文档 design_doc = { "_id": "_design/count_views", "views": { "by_count": { "map": "function(doc) { emit(doc.count, 1); }" } } } try: existing_doc = db[design_doc['_id']] # 对比视图是否有变化,这里直接更新 existing_doc['views'] = design_doc['views'] db.save(existing_doc) self.stdout.write(self.style.SUCCESS("设计文档已更新")) except couchdb.ResourceNotFound: db.save(design_doc) self.stdout.write(self.style.SUCCESS("设计文档已创建"))
3. 运行命令创建视图
在终端执行:
python manage.py create_couchdb_views
注意事项
- 设计文档的
_id必须以_design/开头,这是CouchDB的硬性规定。 - 永久视图会被CouchDB预索引,查询性能比临时视图好很多,适合频繁使用的查询场景。
- 如果修改了视图的map函数,保存设计文档后CouchDB会自动重新索引数据(数据量大的话可能需要一点时间)。
内容的提问来源于stack exchange,提问作者Teenu TTT
相关产品推荐
相关产品推荐

