【问题标题】:python couchdb revision conflictpython couchdb 修订冲突
【发布时间】:2011-10-17 16:36:05
【问题描述】:

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

somedoc = Doc.load(db,id)

更新前通过

doc.store(db)

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

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

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

干杯

【问题讨论】:

    标签: python database couchdb


    【解决方案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 引发 ResourceConflict 时再次存储之前重做 try 命令之前对 doc 的任何更新。

    【讨论】:

      【解决方案2】:

      您是否检查以确保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 生成的。

      【讨论】:

      • 是的,我在更新之前添加了一个检查版本冲突的检查,它声称文档是最新的!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多