Python CouchDB 修订冲突
我有一个用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命令之前对文档的任何更新,然后再存储。