Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使更改在Boto中持久化_Python_Amazon Simpledb_Boto - Fatal编程技术网

Python 使更改在Boto中持久化

Python 使更改在Boto中持久化,python,amazon-simpledb,boto,Python,Amazon Simpledb,Boto,我有一个SimpleDB实例,我使用boto for Python更新和读取该实例: sdb = boto.connect_sdb(access_key, secret_key) domain = sdb.get_domain('DomainName') itemName = 'UserID' itemAttr = {'key1': 'val1', 'key2': val2} userDom.put_attributes(itemName, itemAtt

我有一个SimpleDB实例,我使用boto for Python更新和读取该实例:

    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.sleep1,一切都会正常工作

我怀疑这个问题是由于put_atributes向数据库发送写入信号,但不会等到这个更改被持久化。我也尝试过使用创建项目然后保存该项目来编写。保存没有太大成功。有人知道如何确保在继续执行下一个操作之前已在SimpleDB实例中写入值吗


谢谢。

这里的问题是,默认情况下,SimpleDB最终是一致的。因此,当您写入数据,然后立即尝试读取数据时,虽然可以保证数据最终是一致的,但不能保证获得最新的数据。对于SimpleDB,最终通常意味着不到一秒钟,但无法保证需要多长时间

但是,有一种方法可以告诉SimpleDB,您需要一致的数据视图,并且在必要时愿意等待。您可以通过稍微更改查询代码来实现这一点:

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

这应该总是返回最新的值。

谢谢,这非常有效。我在使用consistent_read时遇到问题,因为我使用的是boto版本1.9b,升级到2.3.0并解决了它。