конфликт версий python couchdb

#python #database #couchdb

#python #База данных #couchdb

Вопрос:

У меня есть программа на python, которая обращается к базе данных CouchDB, создает новые документы и обновляет существующие. Для данной базы данных, базы данных и документа, документа, я стараюсь заботиться и перезагружать документ перед каждой модификацией:

 somedoc = Doc.load(db,id)
  

перед обновлением через

 doc.store(db)
  

Насколько мне известно, в этом не должно быть необходимости, поскольку doc.rev должен обновляться при каждом вызове хранилища. НО … Я получаю сообщения о конфликте:

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

Есть ли какой-либо способ просто принудительно не обновлять и выдавать предупреждающее сообщение, а не создавать фатальную ошибку при этих конфликтах. Или, лучше, есть ли какой-нибудь способ быстрой проверки номера редакции документа — доступ к БД осуществляется двумя сценариями, которые оба обновляются, но оба тщательно загружают каждый документ, быстро вносят изменения и обновляют БД за как можно меньшее время, чтобы свести к минимуму вероятность конфликта….

Приветствия

Ответ №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)
  

Это требует, чтобы все обновления в doc перед командой try были переделаны перед повторным сохранением, когда CouchDB выдает ResourceConflict .

Ответ №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 .

Комментарии:

1. Да, я добавил проверку непосредственно перед обновлением, которая ищет конфликт версий, он утверждает, что документ обновлен!