2011-10-20 30 views
8

Tôi đang cố gắng sử dụng couchdb.py để tạo và cập nhật cơ sở dữ liệu. Tôi muốn thực hiện thay đổi thông báo, tốt nhất là ở chế độ liên tục. Chạy mã thử nghiệm được đăng bên dưới, tôi không thấy cách lược đồ thay đổi hoạt động trong python.thông báo thay đổi couchdb-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) 

Giá trị

db.changes(since=iii-1) 

thông tin lợi nhuận này rất hấp dẫn, nhưng trong một định dạng mà từ đó tôi đã không làm việc ra làm thế nào để trích xuất các chuỗi hoặc sửa đổi số, hoặc các thông tin tài liệu:

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

trong khi đó, các mã tôi thực sự quan tâm đến việc sử dụng:

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

Trả về một đối tượng máy phát điện và không xuất hiện để cung cấp thông báo khi họ đi vào, như CouchDB guide gợi ý ....

Có ai sử dụng thay đổi trong couchdb-python thành công?

+0

Thêm vào các vấn đề này, khi sử dụng với máy chủ từ xa (ví dụ: Cloudant) bị ném cho chỉnh sửa 'từ' oparg .... - điều này có vẻ là do cloudant không lưu trữ bản sửa đổi dưới dạng số nguyên, thay vì chuỗi, làm cho đối số càng trở nên khó hiểu hơn! – radpotato

Trả lời

7

Tôi sử dụng phiếu thăm dò ý kiến ​​dài hơn là liên tục và hoạt động tốt cho tôi. Trong chế độ bỏ phiếu dài db.changes khối cho đến khi ít nhất một thay đổi đã xảy ra và sau đó trả về tất cả các thay đổi trong đối tượng trình tạo.

Đây là mã tôi sử dụng để xử lý các thay đổi. settings.db là đối tượng Cơ sở dữ liệu CouchDB của tôi.

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 

Như bạn có thể thấy đó là vòng lặp vô hạn nơi chúng tôi gọi changes trên mỗi lần lặp lại. Cuộc gọi đến changes trả về một từ điển có hai phần tử, số thứ tự của bản cập nhật gần đây nhất và các đối tượng đã được sửa đổi. Sau đó tôi lặp qua từng kết quả tải đối tượng thích hợp và xử lý nó.

Đối với nguồn cấp dữ liệu liên tục, thay vì sử dụng dòng while True:for changes in settings.db.changes(feed="continuous", since=since).

4

Tôi thiết lập một người chia sẻ thư sử dụng một cái gì đó tương tự như thế này. Bạn cũng sẽ cần phải tải couchdb.Session() Tôi cũng sử dụng một bộ lọc để chỉ nhận được các email chưa gửi đến bộ đệm thay đổi nguồn cấp dữ liệu.

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) 

Điều này sẽ cho phép bạn truy cập tài liệu trực tiếp từ nguồn cấp dữ liệu thay đổi, điều chỉnh dữ liệu của bạn và cập nhật tài liệu. Tôi sử dụng một khối try/except trên 'db.save (doc)' thực tế để có thể nắm bắt khi một tài liệu được cập nhật trong khi tôi đang chỉnh sửa và tải lại tài liệu trước khi lưu.

Các vấn đề liên quan