Удаление всех документов в CouchDB

У меня есть база данных, и я хочу обрезать все записи, я знаю, что можно просто добавить ключ _deleted к каждому документу или вызвать db.delete() в библиотеке CouchDB-python. Я использую delete of couchdb-python, но, кажется, он не работает, когда я получаю все документы и затем вызываю.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 ответа

Решение

В couchdb-python view запрос возвращает список couchdb.client.Row объекты, а не список документов. Вам нужно передать атрибут doc к этому deleteт.е. get_db().delete(i['doc']),

Однако с точки зрения производительности лучше использовать массовый 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)

Удаление документов из CouchDB вы можете создать в два этапа:

  • создать представление (с фильтрацией документов, которые вы хотите удалить)
  • использовать вид, чтобы удалить все документы, используя вид

Я написал инструмент для этого.

Другие вопросы по тегам