2011-10-17 11 views
2

私はcouchDBデータベースにアクセスし、新しい文書を作成し、既存のものを更新するpythonプログラムを持っています。 与えられたデータベース、DB、およびドキュメント、ドキュメントのために、私が世話をし、それぞれ変更前の文書をリロードしてみてください:python couchdb改訂の競合

somedoc = Doc.load(db,id) 

私の知る限り、この承知のように

doc.store(db) 

経由で更新する前にストアが呼び出されるたびにdoc.revを更新する必要があるため、必要ありません。しかし...私は、競合メッセージを取得しています:

couchdb.http.ResourceConflict: (u'conflict', u'Document update conflict.') 

はただ何も更新し、警告メッセージを強制しないではなく、これらの競合の際に致命的なエラーを持っていることのいずれかの方法があります。あるいは、文書のリビジョン番号をすばやく確認する方法はありますか?dbには両方とも更新される2つのスクリプトでアクセスされますが、両方とも各文書の読み込みに注意を払い、変更をすばやく行い、できるだけ短い時間でdbを更新します

乾杯

答えて

0

だけでドキュメントを保存する前に、私はリビジョンが正しいことを確認することを与えているから来リソースの競合、どこ私はまだ働いていない。しかし

latestRev = CouchDoc.load(db,doc.id) 
if latestRev.rev != doc.rev: 
    print 'revision mismatch ' + doc.rev + '\t' + revs.rev 
else: 
    doc.store(db) 

は、丸い簡単な方法があります致命的なエラー(のpythonに新しいので、前にこれをやって考えていなかった)原因紛争:

try: 
    doc.store(db) 
except couchdb.http.ResourceConflict: 
    latestDoc = ConflictDoc.load(db,doc.id) 

をこれはCouchDBのはResourceConflictをスローしたときにトライコマンドの前に、ドキュメントへの更新を再度格納する前にやり直されていることを要求しません。

-1

....紛争の可能性を最小限にするためにあなたがしたときstoredocのリビジョンが更新されていることを確認するためにチェックしましたか? 私が使用したライブラリは docを変更するのではなく、成功したときに新しいリビジョンを返します store

編集:私は、彼らがdocを編集します推測:

>>> db = s.get_or_create_db('test') 
>>> doc = { '_id': 'abc', 'content': 'words' } 
>>> db.save_doc(doc) 
{'rev': '1-a5856d62f2444efb55cbcb5d1db7e02c', 'ok': True, 'id': 'abc'} 
>>> doc 
{'content': 'words', '_rev': '1-a5856d62f2444efb55cbcb5d1db7e02c', '_id': 'abc'} 
>>> 

このサンプルは、couchdbkitを使用して生成されました。

+0

ええ、リビジョンの競合を探すアップデートの直前にチェックを追加しました。ドキュメントが最新であると主張しています。 – radpotato

関連する問題