8

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の変更をうまく使用しましたか?

4

2 に答える 2

7

私は連続ではなく長いポーリングを使用していますが、それは私にとってはうまくいきます。ロング ポーリング モードdb.changesでは、少なくとも 1 つの変更が発生するまでブロックし、その後、すべての変更をジェネレータ オブジェクトで返します。

変更を処理するために使用するコードを次に示します。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

ご覧のとおり、これはchanges反復ごとに呼び出す無限ループです。への呼び出しchangesは、最新の更新のシーケンス番号と変更されたオブジェクトの 2 つの要素を持つ辞書を返します。次に、各結果をループして、適切なオブジェクトをロードして処理します。

連続送りの場合は、while True:ラインの代わりに を使用しますfor changes in settings.db.changes(feed="continuous", since=since)

于 2011-10-26T15:36:12.077 に答える
4

これに似たものを使用してメールスプーラをセットアップします。また、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)

これにより、変更フィードからドキュメントに直接アクセスし、必要に応じてデータを操作し、最終的にドキュメントを更新できます。実際の 'db.save(doc)' で try/except ブロックを使用して、編集中にドキュメントが更新されたことをキャッチし、保存する前にドキュメントをリロードします。

于 2012-03-09T11:14:27.763 に答える