couchdb-python更改通知

rad*_*ato 8 python couchdb couchdb-python

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

价值

db.changes(since=iii-1) 
Run Code Online (Sandbox Code Playgroud)

返回感兴趣的信息,但是我没有弄清楚如何提取序列或修订号或文档信息的格式:

{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}]}
Run Code Online (Sandbox Code Playgroud)

同时,我真正感兴趣的代码使用:

db.changes(feed='continuous',since=4,heartbeat=1000)
Run Code Online (Sandbox Code Playgroud)

返回一个生成器对象,并且在它们进入时似乎不提供通知,正如CouchDB 指南建议的那样....

有没有人成功使用couchdb-python中的更改?

And*_*son 7

我使用长轮询而不是连续,这对我来说没问题.在长轮询模式下db.changes阻塞,直到至少发生一次更改,然后返回生成器对象中的所有更改.

这是我用来处理更改的代码.settings.db是我的CouchDB数据库对象.

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它是一个无限循环,我们changes在每次迭代时调用它.调用changes返回包含两个元素的字典,即最新更新的序列号和已修改的对象.然后我循环遍历每个结果加载适当的对象并处理它.

对于连续进料,而不是while True:使用for changes in settings.db.changes(feed="continuous", since=since).