Python CouchDB 修订冲突

3 投票
2 回答
3199 浏览
提问于 2025-04-17 04:29

我有一个用Python写的程序,它可以访问一个叫做CouchDB的数据库,创建新文档并更新已有的文档。对于某个特定的数据库(db)和文档(Doc),我会在每次修改之前先重新加载这个文档,以确保数据是最新的:

somedoc = Doc.load(db,id)

在通过下面的方式更新之前:

doc.store(db)

据我所知,这样做其实不是必须的,因为每次调用存储(store)时,文档的版本号(doc.rev)应该会自动更新。但是……我却收到了冲突的错误信息:

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

有没有办法强制不进行更新,并只显示一个警告信息,而不是在出现这些冲突时直接报错?或者更好的是,有没有什么方法可以快速检查文档的版本号?因为这个数据库是由两个脚本同时访问并更新的,但它们都很小心地加载每个文档,快速进行修改,并尽量在最短的时间内更新数据库,以减少冲突的可能性……

谢谢!

2 个回答

-1

你有没有确认在你执行 store 操作时,doc 的版本是更新的?我用过的库不会直接修改 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 生成的。

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)

这需要在couchDB抛出资源冲突错误时,重新执行在try命令之前对文档的任何更新,然后再存储。

撰写回答