2017-10-23 2 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を返すすべての文書を取得しますどのようにでしょうか?それともこの周りには何か方法はありますか?次の2つのステップで作成できるのCouchDBから文書を削除

+0

なぜこのようにしますか?データベースを削除して再作成するほうが簡単ではないでしょうか? – Flimzy

+0

データベースを削除すると、再度すべてのビューを再作成する必要がありますか?そうですか?申し訳ありませんが、私はかなり新しいです。 @Flimzy – essramos

+0

はい。しかし、うまくいけば簡単にそれを行う方法があります。 – Flimzy

答えて

0

couchdb-pythonviewクエリでは、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) 
+0

素晴らしい。 _deletedを追加するとうまくいくと思いました。ありがとうございました。これは完全に機能します。 – essramos

0

  • ビュー
を使用してすべての文書を削除するためにビューを使用
  • (削除したい文書をフィルタリングして)ビューを作成します

    これについてはtoolと書いてあります。

  • +0

    はちょっと複雑に思えますが、私はそれをPython中心にしたいと思います。 – essramos

    関連する問題