DynamoDb存储对象重复

0 投票
2 回答
1957 浏览
提问于 2025-04-18 12:25

我写了这个函数来检查一个对象是否已经存储在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。

撰写回答