2011-10-20 38 views
8

oluşturmak ve veritabanlarının güncellenmesi couchdb.py kullanmaya çalışıyorum. Tercihen sürekli modda bildirim değişiklikleri uygulamak istiyorum. Aşağıda belirtilen test kodunu çalıştırarak, değişiklik şemasının python içinde nasıl çalıştığını göremiyorum.CouchDB-piton değişim bildirimleri

class SomeDocument(Document): 

############################################################################# 

# def __init__ (self): 

    intField = IntegerField()#for now - this should to be an integer 
    textField = TextField() 

couch = couchdb.Server('http://127.0.0.1:5984') 
databasename = 'testnotifications' 

if databasename in couch: 
    print 'Deleting then creating database ' + databasename + ' from server' 
    del couch[databasename] 
    db = couch.create(databasename) 
else: 
    print 'Creating database ' + databasename + ' on server' 
    db = couch.create(databasename) 

for iii in range(5): 

    doc = SomeDocument(intField=iii,textField='somestring'+str(iii)) 
    doc.store(db) 
    print doc.id + '\t' + doc.rev 

something = db.changes(feed='continuous',since=4,heartbeat=1000) 

for iii in range(5,10): 

    doc = SomeDocument(intField=iii,textField='somestring'+str(iii)) 
    doc.store(db) 
    time.sleep(1) 
    print something 
    print db.changes(since=iii-1) 

değer ilgi olduğunu

db.changes(since=iii-1) 

bilgiyi, ama sırası veya revizyon numaralarını veya belge bilgi ayıklamak nasıl çalışmamış olan bir formatta:

{u'last_seq': 6, u'results': [{u'changes': [{u'rev': u'1-9c1e4df5ceacada059512a8180ead70e'}], u'id': u'7d0cb1ccbfd9675b4b6c1076f40049a8', u'seq': 5}, {u'changes': [{u'rev': u'1-bbe2953a5ef9835a0f8d548fa4c33b42'}], u'id': u'7d0cb1ccbfd9675b4b6c1076f400560d', u'seq': 6}]} 

arada kod kullanıyorum gerçekten ilgileniyorum:

db.changes(feed='continuous',since=4,heartbeat=1000) 
CouchDB guide anlaşılacağı gibi

Herkes başarıyla CouchDB-piton değişiklikleri kullandı .... bir jeneratör nesnesini döndürür ve onlar gelir gibi bildirimler sağlamak görünmüyor?

+0

Ayrıca bu sorunlara, (örneğin Cloudant) hataları için atılan bir uzak sunucu ile kullanırken oparg .... düzenle 'beri' - Bu cloudant ziyade dizeleri olarak, tamsayı olarak revizyonlar saklamaz çünkü görünüyor, Bu yana argüman bile daha kafa karıştırıcı yapar! – radpotato

cevap

7

Ben sürekli yerine uzun yoklama kullanın ve bu benim için Tamam çalışır. Uzun yoklama modunda db.changes bloklar en az bir değişiklik oldu ve ardından bir jeneratör nesnesindeki tüm değişiklikleri döndürür kadar. İşte

Ben değişiklikleri işlemek için kullanın koddur. settings.db, CouchDB Veritabanı nesnesidir.

since = 1 
while True: 
    changes = settings.db.changes(since=since) 
    since = changes["last_seq"] 
    for changeset in changes["results"]: 
     try: 
      doc = settings.db[changeset["id"]] 
     except couchdb.http.ResourceNotFound: 
      continue 
     else: 
      // process doc 

Eğer biz her tekrarında changes diyoruz sonsuz döngü olduğunu görebileceğiniz gibi. changes numaralı çağrı, iki öğeye sahip bir sözlük, en son güncellemenin sıra numarası ve değiştirilen nesneler döndürür. Daha sonra her bir nesneyi uygun nesneyi yükleyerek ve işleyerek geçiriyorum.

Sürekli besleme için, while True: satırı yerine for changes in settings.db.changes(feed="continuous", since=since) kullanın.

4

Ben kurulum buna benzer bir şey kullanarak bir mailspooler. Ayrıca, couchdb.Session() öğesini yüklemeniz gerekecek. Ayrıca, biriktirici değişiklikleri feed'ine yalnızca gönderilmeyen e-postalar almak için bir filtre kullanıyorum.

from couchdb import Server 

    s = Server('http://localhost:5984/') 
    db = s['testnotifications'] 
    # the since parameter defaults to 'last_seq' when using continuous feed 
    ch = db.changes(feed='continuous',heartbeat='1000',include_docs=True) 

    for line in ch: 
     doc = line['doc'] 
     // process doc here 
     doc['priority'] = 'high' 
     doc['recipient'] = 'Joe User' 
     # doc['state'] + 'sent' 
     db.save(doc) 

Bu, size beslemek değişikliklerden doğrudan dokümana erişmesini sağlayacak uygun gördüğünüz gibi verileri işlemek ve son olarak size belge güncelleyecektir. Gerçekte 'db.save (doc)' üzerinde bir try/except bloğu kullanıyorum, böylece bir belgeyi güncellediğimde kaydederken yakalayabiliyorum ve kaydetmeden önce dokümanı yeniden yükleyebiliyordum.