конфликт ревизий python couchdb - PullRequest
2 голосов
/ 17 октября 2011

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

somedoc = Doc.load(db,id)

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

doc.store(db)

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

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

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

Приветствия

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Я до сих пор не выяснил, откуда возник конфликт ресурсов, учитывая, что непосредственно перед сохранением документа я проверяю, что ревизия верна:

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.

0 голосов
/ 17 октября 2011

Проверяли ли вы, чтобы версия 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...