Python DynamoDb存储的对象重复
我编写这个函数是为了查看对象是否已经存储在dynamo中Python DynamoDb存储的对象重复,python,amazon-web-services,amazon-dynamodb,Python,Amazon Web Services,Amazon 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
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
在写入任何db之前,我调用支票:
if(dynamoStorage.doesIDExist(theNewKey)==False):
data= recursiveInnerFile(fPath,theNewKey)
images = data[0]
text = data[1]
dynamoStorage.createSwfInDynamo(theNewKey,images,text)
但我仍然有重复出现。我错过了什么
编辑:
我没有收到错误:
我得到一个table对象,我的函数返回True。但什么都没有添加
第二次编辑:
我在下面解决了这个问题。为了避免重复,最好的方法是使用“有条件放置”,这样,如果已经存在具有密钥的项,新项将不会覆盖该现有项 请参阅有关python的详细信息 创建新项目或用新项目替换旧项目(包括 所有属性)。如果指定的表中已存在具有 相同的主键,新项将完全替换旧项 项目。您可以通过指定预期的 规则 您只需要将“预期”作为字典传递给put\u项调用
expected={
'yourHashKeyName': {'Exists': False}
}
上面的代码无法工作的原因是dynamoConn.query将始终返回TableGenerator对象,即使没有具有该哈希键的项
查询函数接受一个值,该值返回“查询操作的项目总数,即使该操作没有与分配的筛选器匹配的项目。”
然后检查
results.count > 0
如果该id已存在,则results.count应为1。否则应该是0
另一个选项是使用get_item API。您的表没有范围键,您可以使用“id”作为hashkey调用get\u项 我解决了这个问题。问题是返回的对象不是表。我需要用.table获取表格,然后获取count.item\u 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
我担心的是,数据在技术上不同于不同的日期,但我希望它不会基于id覆盖。您能进一步解释条件put吗?它是否只在基于ID的情况下工作,还是需要完全相同?如果一个条件put通过并改变了文件,那么我将丢失表中指向s3文件的部分。唯一性仅由ID决定。以上解决方案都不需要您的数据作为输入。啊,好的,谢谢。事实上,我发现我的代码出了什么问题。但这也行得通。我不太确定这在我的情况下是否真的行得通。我需要看看它是否存在,这样我就可以放其他东西了。如果创建了这个,我将在另一个表中创建相关的其他内容。条件put是否返回布尔值?
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