Удаление всех документов в 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 вы можете создать в два этапа:
- создать представление (с фильтрацией документов, которые вы хотите удалить)
- использовать вид, чтобы удалить все документы, используя вид
Я написал инструмент для этого.