我的目标:简单地更新DynamoDB中记录的单个属性。我不想先读这个项目;我只是设置了它的一个属性 - 我不关心属性的先前值是什么,如果有的话。
问题:如果该项目已存在,则boto会抛出ConditionalCheckFailedException
。
一些说明问题的代码:
from boto.dynamodb2.items import Item
from boto.dynamodb2.table import Table
from time import time
table = Table('my_table')
data = {
'the_key': '123456',
'last_seen': time()
}
item = Item(table, data=data)
item.partial_save()
我第一次运行此代码时(当项目123456不存在时),它可以正常工作。创建了项目123456,并设置了其last_seen
属性。
第二次运行代码时,它会爆炸:
boto.dynamodb2.exceptions.ConditionalCheckFailedException: ConditionalCheckFailedException: 400 Bad Request
{u'message': u'The conditional request failed', u'__type': u'com.amazonaws.dynamodb.v20120810#ConditionalCheckFailedException'}
查看boto代码,看起来partial_save
正在设置expects
参数,迫使DynamoDB检查属性的先前值(如果不是预期的话,则会失败)。据我所知,boto试图帮助我意外地覆盖其他一些进程可能已更新的数据。但是,在这种情况下,我并不关心;我只是想盲目地设置属性值,即使这意味着它会覆盖别人的变化。
有没有办法使用boto.dynamodb2? (我使用boto.dynamodb拼凑了一个工作版本,但我真的不想使用已弃用的代码。)