2012-04-05 59 views
0

執着我有更新和使用博託爲Python閱讀SimpleDB的實例:進行更改在博託

sdb = boto.connect_sdb(access_key, secret_key) 
    domain = sdb.get_domain('DomainName') 
    itemName = 'UserID' 
    itemAttr = {'key1': 'val1', 'key2': val2} 
    userDom.put_attributes(itemName, itemAttr) 

一個可行的預期。名稱爲'UserID'且值爲val1和val2的新項目將被插入域中。現在

,是我面臨的問題是,如果我查詢,更新它的屬性後域正確,

query = 'select * from `DomainName` where key1=val1' 
    check = domain.select(query) 
    itemName = check.next()['key2'] 

我會得到一個錯誤,因爲該行的值找不到。但是,如果我在寫入和讀取之間添加time.sleep(1),則一切正常。

我懷疑這個問題是由於put_atributes發信號寫入數據庫的事實,但不會等到這個改變持續。我也嘗試寫入使用創建一個項目,然後保存該項目(item.save())沒有太多的成功。有誰知道在繼續進行下一步操作之前,如何確保這些值已寫入SimpleDB實例中?

謝謝。

回答

0

這裏的問題是,SimpleDB默認情況下最終是一致的。因此,當您編寫數據並立即嘗試讀取數據時,您不能保證獲得最新數據,儘管您可以保證數據最終保持一致。使用SimpleDB,最終通常意味着不到一秒鐘,但不能保證可能需要多長時間。

但是,有一種方法可以告訴SimpleDB您希望數據的一致視圖,並且在必要時願意等待。您可以通過稍微更改您的查詢代碼來做到這一點:

query = 'select * from `DomainName` where key1=val1' 
check = domain.select(query, consistent_read=True) 
itemName = check.next()['key2'] 

這應該總是返回最新值。

+0

謝謝,這工作完美。我遇到了使用consistent_read的問題,因爲我使用boto版本1.9b,升級到2.3.0並解決了它。 – angelrh 2012-04-05 17:31:36