2011-10-17 6 views
2

J'ai un programme python qui accède à une base de données couchDB, crée de nouveaux documents et met à jour ceux qui existent déjà. avant la mise à jour viapython couchdb révision conflit

doc.store(db) 

En ce qui concerne

somedoc = Doc.load(db,id) 

que je sache ceci: Pour une base de données, db, et le document, Doc, j'essaie de prendre soin et de recharger le document avant chaque modification ne devrait pas être nécessaire, car doc.rev devrait être mis à jour chaque fois que le magasin est appelé. MAIS ... Je reçois des messages de conflit:

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

Est-il possible de simplement forcer aucune mise à jour et un message d'avertissement plutôt que d'avoir une erreur fatale lors de ces conflits. Ou, mieux, existe-t-il un moyen de vérifier rapidement le numéro de révision du document - la db est accessible par deux scripts qui se mettent à jour, mais tous les deux prennent soin de charger chaque document, de modifier rapidement pour minimiser les risques d'un conflit ....

Vive

Répondre

0

Je n'ai toujours pas où le conflit de ressources vient, étant donné que juste avant d'enregistrer un document que je vérifie que la révision est correcte:

latestRev = CouchDoc.load(db,doc.id) 
if latestRev.rev != doc.rev: 
    print 'revision mismatch ' + doc.rev + '\t' + revs.rev 
else: 
    doc.store(db) 

Cependant, il existe un moyen facile autour de la conflit provoquant une erreur fatale (nouveau à python, donc ne pense pas que de le faire avant):

try: 
    doc.store(db) 
except couchdb.http.ResourceConflict: 
    latestDoc = ConflictDoc.load(db,doc.id) 

cela ne nécessite que toutes les mises à jour de doc avant la commande try sont refaits avant de le ranger à nouveau lorsque CouchDB jette un ResourceConflict .

-1

Avez-vous vérifié pour vous assurer que la révision de doc est mis à jour lorsque vous store? Les bibliothèques que j'ai utilisées ne modifieront pas doc mais retourneront la nouvelle révision après un succès store.

Edit: Je suppose qu'ils vont modifier 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'} 
>>> 

Cet échantillon a été généré en utilisant couchdbkit.

+0

Oui, j'ai ajouté une vérification juste avant la mise à jour qui recherche un conflit de révision, elle prétend que le document est à jour! – radpotato

Questions connexes