2011-10-17 2 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는 두 개의 스크립트로 모두 업데이트되지만 두 문서 모두를로드하는 데주의를 기울이고 가능한 빨리 수정하고 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) 

가, 라운드 쉬운 방법이있다 치명적인 오류가 발생 충돌 (파이썬에 새를, 그래서 전 이렇게 생각하지 않았다) :

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

이것은 시도 명령 전에 문서에 대한 업데이트가 CouchDB를가 ResourceConflict를 throw 할 때 다시 저장하기 전에 다시하게되는 것을 요구 않습니다 .

-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