python couchdb修订版冲突

时间:2011-10-17 16:36:05

标签: python database couchdb

我有一个python程序,可以访问couchDB数据库,创建新文档并更新现有文档。 对于给定的数据库,db和文档Doc,我会在每次修改之前注意并重新加载文档:

somedoc = Doc.load(db,id)

在通过

更新之前
doc.store(db)

据我所知,这不应该是必要的,因为每次调用商店时都应该更新doc.rev。但是......我收到了冲突消息:

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

是否有任何方法可以强制不更新和警告消息,而不是在这些冲突上发生致命错误。或者,更好的是,是否有某种方法可以快速检查文档修订号 - 两个脚本都会更新数据库,但两者都要小心加载每个文档,快速修改并在尽可能短的时间内更新数据库尽量减少冲突的可能性......

干杯

2 个答案:

答案 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生成的。