删除CouchDB中的所有文档

时间:2017-10-23 07:35:42

标签: python-3.x couchdb couchdb-python couchdb-2.0

我有一个数据库,我想截断所有记录,我知道可以只为每个文档添加一个_deleted键,或者在CouchDB-python库上调用db.delete()。我正在使用couchdb-python的delete但是当我获取所有文档然后在除了设计文档之外的每个文档上调用.delete时它似乎不起作用。

这是我的代码。

docs = get_db().view('_all_docs', include_docs=True)
for i in docs:
    if not(i['id'].startswith('_')):
        get_db().delete(i)

这是错误。因为_all_docs的结果是返回id而不是_id

File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\couchdb\client.py", line 625, in delete
if doc['_id'] is None:
KeyError: '_id'

我的问题是如何获取所有返回_id而不仅仅是id的文档?或者有什么方法可以解决这个问题?

2 个答案:

答案 0 :(得分:0)

从CouchDB中删除文档,您可以分两步创建:

  • 创建一个视图(过滤要删除的文档)
  • 使用视图使用视图删除所有文档

我为此写了tool

答案 1 :(得分:0)

couchdb-python中,view查询会返回couchdb.client.Row个对象的列表,而不是文档列表。您需要将属性doc传递给delete,即get_db().delete(i['doc'])

但从性能角度来看,最好使用bulk api。使用couchdb-python时,它看起来应该是这样的:

rows = get_db().view('_all_docs', include_docs=True)
docs = []
for row in rows:
    if row['id'].startswith('_'):
        continue
    doc = row['doc']
    doc['_deleted'] = True
    docs.append(doc)
get_db().update(docs)