我有一个python程序,可以访问couchDB数据库,创建新文档并更新现有文档。 对于给定的数据库,db和文档Doc,我会在每次修改之前注意并重新加载文档:
somedoc = Doc.load(db,id)
在通过
更新之前doc.store(db)
据我所知,这不应该是必要的,因为每次调用商店时都应该更新doc.rev。但是......我收到了冲突消息:
couchdb.http.ResourceConflict: (u'conflict', u'Document update conflict.')
是否有任何方法可以强制不更新和警告消息,而不是在这些冲突上发生致命错误。或者,更好的是,是否有某种方法可以快速检查文档修订号 - 两个脚本都会更新数据库,但两者都要小心加载每个文档,快速修改并在尽可能短的时间内更新数据库尽量减少冲突的可能性......
干杯
答案 0 :(得分:1)
我仍然没有解决资源冲突的来源,因为在存储文档之前,我检查修订是否正确:
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)
这确实需要在tryDB命令之前重新对doc进行任何更新,然后再重新存储,当couchDB抛出ResourceConflict时。
答案 1 :(得分:-1)
您是否检查过doc
时是否确保更新了store
的修订版? 我使用的库不会修改 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
生成的。