首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >couchdb-python更改通知

couchdb-python更改通知
EN

Stack Overflow用户
提问于 2011-10-21 02:23:40
回答 2查看 3.4K关注 0票数 8

我正在尝试使用couchdb.py来创建和更新数据库。我想实现通知更改,最好是连续模式。运行下面发布的测试代码,我看不到python中的更改方案是如何工作的。

代码语言:javascript
复制
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)

价值

代码语言:javascript
复制
db.changes(since=iii-1) 

返回感兴趣的信息,但其格式我还不知道如何提取序列号或修订号,或者文档信息:

代码语言:javascript
复制
{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}]}

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

代码语言:javascript
复制
db.changes(feed='continuous',since=4,heartbeat=1000)

返回一个生成器对象,并且不会像CouchDB guide建议的那样在传入时提供通知。

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

EN

回答 2

Stack Overflow用户

发布于 2011-10-26 23:36:12

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

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

代码语言:javascript
复制
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的调用将返回一个包含两个元素的字典,即最近更新的序列号和修改过的对象。然后,我遍历每个结果,加载适当的对象并处理它。

对于连续提要,使用for changes in settings.db.changes(feed="continuous", since=since)代替while True:行。

票数 7
EN

Stack Overflow用户

发布于 2012-03-09 19:14:28

我使用类似的东西设置了一个邮件假脱机程序。您还需要加载couchdb.Session(),我还使用了一个过滤器,用于仅接收未发送到假脱机程序更改提要的电子邮件。

代码语言:javascript
复制
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)

这将允许您直接从changes提要访问您的文档,按照您认为合适的方式操作您的数据,最后更新您的文档。我在实际的'db.save( doc )‘上使用了try/except块,这样我就可以在编辑文档时捕获文档的更新,并在保存文档之前重新加载文档。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7840383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档