2017-10-23 8 views
1

데이터베이스가 있고 모든 레코드를 자르고 싶습니다. 모든 문서에 _deleted 키를 추가하거나 CouchDB-python 라이브러리에서 db.delete()를 호출하는 것이 가능하다는 것을 알고 있습니다. couchdb-python의 delete을 사용하고 있지만 모든 문서를 가져 와서 디자인 문서를 제외하고 각 .delete를 호출하면 작동하지 않는 것 같습니다.CouchDB에서 모든 문서 삭제

여기 내 코드입니다.

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 반환 모든 문서를 가져 어떻게입니까? 아니면이 주변에 어떤 방법이 있습니까? CouchDB를에서

+0

왜 이것을 원하니? 데이터베이스를 삭제하고 다시 만드는 것이 더 쉽지 않을까요? – Flimzy

+0

데이터베이스를 삭제하면 다시 모든 뷰를 다시 만들어야합니까? 그게 맞습니까? 죄송합니다. 저는 소파가 새롭습니다. @Flimzy – essramos

+0

예. 그러나 잘하면 당신은 그것을 할 수있는 쉬운 방법이 있습니다. – Flimzy

답변

0

couchdb-python에서 view 쿼리는 couchdb.client.Row 개체 목록을 반환하며 문서 목록은 반환하지 않습니다. delete에 속성 doc을 전달해야합니다 (예 : 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) 
+0

위대한. _deleted를 추가하면 효과가 있다고 생각했습니다. 고맙습니다. 이것은 완벽하게 작동합니다. – essramos

0

삭제 된 문서는 두 단계에서 만들 수 있습니다

을 사용하여 모든 문서를 삭제하려면보기를 사용 (삭제하려는 문서를 필터링)보기를 만들

나는 이것을 위해 tool을 작성했습니다.

+0

은 약간 복잡해 보이며 파이썬 중심이기를 원합니다. – essramos