уведомления об изменениях в couchdb-python - PullRequest
8 голосов
/ 20 октября 2011

Я пытаюсь использовать couchdb.py для создания и обновления баз.Я хотел бы реализовать уведомления об изменениях, желательно в непрерывном режиме.Запустив тестовый код, опубликованный ниже, я не вижу, как схема изменений работает в Python.

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)

Значение

db.changes(since=iii-1) 

возвращает интересующую информацию, но вФормат, из которого я не разработал, как извлечь номера последовательности или редакции или информацию о документе:

{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}]}

Между тем, код, который мне действительно интересно использовать:

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

Возвращает объект генератора и, по-видимому, не выдает уведомления по мере их поступления, как подсказывает руководство CouchDB ....

Кто-нибудь успешно использовал изменения в couchdb-python

Ответы [ 2 ]

7 голосов
/ 26 октября 2011

Я использую длинный опрос, а не непрерывный, и у меня это хорошо работает.В длинном режиме опроса db.changes блокирует, пока не произошло хотя бы одно изменение, а затем возвращает все изменения в объекте генератора.

Вот код, который я использую для обработки изменений.settings.db - это мой объект CouchDB Database.

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

Как вы можете видеть, это бесконечный цикл, в котором мы вызываем changes на каждой итерации.Вызов changes возвращает словарь с двумя элементами: порядковый номер самого последнего обновления и объекты, которые были изменены.Затем я перебираю каждый результат, загружая соответствующий объект и обрабатывая его.

Для непрерывной подачи вместо строки while True: используйте for changes in settings.db.changes(feed="continuous", since=since).

4 голосов
/ 09 марта 2012

Я установил почтовый буфер, используя что-то похожее на это.Вам также необходимо загрузить couchdb.Session (). Я также использую фильтр только для получения неотправленных писем в фид изменений спулера.

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)

Это позволит вам получить доступ к документу непосредственно из фида изменений,манипулируйте своими данными так, как считаете нужным, и, наконец, обновите документ.Я использую блок try / исключением для фактического db.save (doc), чтобы я мог отследить, когда документ обновлялся во время редактирования, и перезагрузить документ перед сохранением.

...