DynamoDb存储对象重复
我写了这个函数来检查一个对象是否已经存储在dynamo里。
def doesIDExist(key):
print(key)
info=key.split("/")
#set properties
try:
id=info[1]+info[2]
results = dynamoConn.query(swfTable,id)
if results is not None:
return True
except:
return False
return False
在写入任何数据库之前,我会先进行检查:
if(dynamoStorage.doesIDExist(theNewKey)==False):
data= recursiveInnerFile(fPath,theNewKey)
images = data[0]
text = data[1]
dynamoStorage.createSwfInDynamo(theNewKey,images,text)
但是我还是发现有重复的记录出现。我漏掉了什么呢?
补充说明:
我没有收到错误信息:我得到了一个表对象,而且我的函数返回了True。但是没有任何东西被添加进去?
第二次补充:
我在下面解决了这个问题。
2 个回答
0
我解决了这个问题。问题在于返回的对象不是一个表格。我需要先用 .table 获取到表格,然后再用 .item_count 来获取数量。
def doesIDExist(key):
print(key)
info=key.split("/")
#set properties
#try:
id=info[1]+info[2]
results = dynamoConn.query(swfTable,id).table.item_count
print results
if results > 0:
return True
#except:
# return False
return False
2
为了避免重复,最好的方法是使用“条件放置”,这样如果已经有一个相同键的项目存在,新项目就不会覆盖掉那个已有的项目。
可以查看这个文档,了解Python的相关内容。
这个功能可以创建一个新项目,或者用新项目替换旧项目(包括所有属性)。如果在指定的表中已经存在一个相同主键的项目,新项目会完全替换掉旧项目。你可以通过指定一个期望的规则来执行条件放置。
你只需要将'expected'作为字典传递给你的put_item调用。
expected={
'yourHashKeyName': {'Exists': False}
}
你上面的代码之所以不工作,是因为dynamoConn.query总是会返回一个TableGenerator对象,即使没有与那个哈希键匹配的项目。
查询函数有一个Count参数,它会返回“查询操作的总项目数,即使该操作没有与指定过滤器匹配的项目。”
results = dynamoConn.query(swfTable,id, count = True)
然后检查一下
results.count > 0
如果那个ID已经存在,results.count应该是1。否则应该是0。
另一个选择是使用get_item API。你的表没有范围键,你可以用“id”作为哈希键来调用get_item。