更新在 dynamodb 中添加属性的项目

2023-12-25

dynamodb 中不能动态添加属性吗?

当我尝试时,我得到了这个错误——”提供的关键元素与架构不匹配".

设想 -

{ id : "123",
  imageName : "elephant.jpg"
}

我想向上述数据添加一个属性 - imagePath : "/path/to/image" 。 我使用了 put_item,但它会替换旧项目(如果存在)。

我正在寻找解决方案 - 如果 id =“123”,则添加 imagePath 属性,否则将新项目添加到表中。

添加属性可以使用 put_item 来实现,但它将替换现有项目。我们如何使用 update_item 动态向现有数据添加属性?(将 imagePath 附加到给定的 json)

我应该使用 imagePath 更改表的架构,然后使用 update_item 函数吗?

我们如何使用 python 来实现这一点?


不幸的是,它无法一步实现。但是,它可以通过两步过程来实现:-

1)尝试有条件地插入数据,即如果键值已经存在,则不执行任何操作(即插入或更新 - 什么也不会发生)

2)如果有一个ConditionalCheckFailedException,然后更新该项目

示例代码:-

在下面的代码中,usertable是表名。该表的关键属性是userid and score。您需要根据您的表结构相应地更改以下代码。

另外,我还分配了键值(如“Mike”)。您需要根据您的用例进行相应的更改。

from __future__ import print_function # Python 2/3 compatibility
from boto.dynamodb2.exceptions import ConditionalCheckFailedException
from botocore.exceptions import ClientError
from boto3.dynamodb.conditions import Attr
import boto3
import json
import decimal

# Helper class to convert a DynamoDB item to JSON.
class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            if o % 1 > 0:
                return float(o)
            else:
                return int(o)
        return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000")

table = dynamodb.Table('usertable')

userId = "Mike"

try :
    response = table.put_item(
    Item={
            'userid': userId,
            'score' : 100,
            'imagePath' : '/path/to/image'        
        },
        ConditionExpression=Attr('userid').ne(userId)        
    )

    print("Conditional PutItem succeeded:")
    print(json.dumps(response, indent=4, cls=DecimalEncoder))
except ClientError as ce :    
    print("Conditional check failed:", ce)
    if ce.response['Error']['Code'] == 'ConditionalCheckFailedException':
        print("Key already exists")
        response = table.update_item(
            Key={'userid': userId, 'score' : 100},
            UpdateExpression="set imagePath = :imagePathVal",
            ExpressionAttributeValues={":imagePathVal" : "/path/to/image" }
        )
        print("Update existing item succeeded:")
        print(json.dumps(response, indent=4, cls=DecimalEncoder))        
    else:
        print("Unexpected error: %s" % e

)

Update:-

变量的数据类型id和关键属性RequestId应该匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新在 dynamodb 中添加属性的项目 的相关文章

随机推荐

  • Ruby on Rails 在资产中查找 css,而不是在 public/stylesheets 中

    我是 Ruby 新手 使用 ruby 1 9 2P180 和 Rails 3 1 0 rc2 我的 my app root public stylesheets screen css 和 application html erb 中有 sc
  • PHP - PDO 获取循环

    我想我在这里失去了理智 这是代码 这是我为了证明这一点而实际尝试做的事情的简化版本 STH DBH gt query SELECT FROM help STH gt setFetchMode PDO FETCH ASSOC while ro
  • Android 运行应用程序内存使用情况

    我们在 Elipse 内存分析工具 在 DDMS 视图中 中看到的堆使用情况 已分配 与 Android 设备上显示的同一应用程序的内存使用大小之间有什么区别 Settings gt Apps gt Running 尽管我积极尝试通过在不需
  • PDF 供下载,而非链接供查看/下载

    我试图做到这一点 以便当您单击 此处下载 时 pdf 文件将下载到用户的桌面 我该怎么做呢 Use the Content Disposition https en wikipedia org wiki List of HTTP heade
  • 将 PowerMock 与 Spock 结合使用

    我有一个带有一些静态方法的类 我需要模拟这些静态方法 我知道 PowerMock 可以做到这一点 但我找不到任何教程 材料来阐明 Spock PowerMock 集成 与 Junit 相比 我更喜欢 Spock 因此出现了难题 有没有办法让
  • Visual Studio 2010 包含目录路径

    我有一个 Visual Studio 解决方案 myvs sln 路径如下 c dir1 dir2 dir3 myvs myvs myvs sln 我安装了 boost 版本 xxxc dir1 dir2 dir3 boostxxx 我在项
  • 如何让 JQuery/Javascript 访问 extJS 生成的元素?

    我正在使用 extJS 构建一个简单的网站 我可以成功地将来自 JQuery 和 extJS 中的点击事件附加到我在 body 标记本身的 HTML 中创建的元素 但是 我附加到 extJS 生成的元素的事件要么没有效果 要么导致不生成 e
  • 如何检查和调整浏览器中的 :before 和 :after 伪元素?

    我使用 after 伪元素创建了一些相当复杂的 DOM 元素 并且我希望能够在 Chrome Inspector 或 Firebug 或等效工具中检查和调整它们 尽管这个功能被提到这篇 WebKit Safari 博客文章 http www
  • Linq to SQL DataContext:如何加载数据?

    我对 Linq to SQL 完全陌生 我正在创建一个与数据库密切配合的 Web 应用程序 我正在寻找最快且连接时间高效的模型 并相信 Linq to SQL 就是这样 我正在使用 C Net4 Visual Studio 2010 为了简
  • jQuery UI 对话框未位于屏幕中央

    我有一个 jQuery 对话框 该对话框位于屏幕中间 然而 它在垂直方向上似乎稍微偏离中心 这是代码 add box dialog autoOpen true width 300 modal true resizable false bgi
  • 如何检查对象中的数组是否全部为空?

    所以我需要传入一个对象 其中每个属性都是数组 该函数将使用每个数组中保存的信息 但我想通过检查每个数组是否为空 空来检查整个对象是否为空 不仅仅是没有属性 到目前为止我所拥有的 function isUnPopulatedObject ob
  • 动画:计时器与空闲

    有一个类似的线程 https stackoverflow com questions 622604 best approach for game animation其他地方 但它专注于游戏编程 我发现它与带有一些 额外糖分 的常规 GUI
  • Nuget 包已安装但引用未解析

    我有一个多项目解决方案 在多个项目中安装了 Prism Nuget 包 然后 我尝试使用 Nuget Package Manager UI 将 Prism Mef 扩展包添加到其中一个项目 我已经将其添加到其他项目之一 我第一次尝试添加软件
  • ng-switch-when 与 ng-repeat

    我的 HTML 代码是 tr td span Ordering Mode span onlineCredentials mode br span Intermedtiary Group span onlineCredentials name
  • 如何检查 CLLocationCooperative2D 是否在四个 CLLocationCooperative2D 正方形内?在 Objective C 中使用 Google 地图

    我想测试 CLLocationCooperative2D 是否位于由其他四个 CLLocationCooperative2D 创建的 Square 内 我有一个这样的结构 typedef struct CLLocationCoordinat
  • 如何更改请求的标头?

    是否可以更改标题Request https developer mozilla org en US docs Web API Request接收到的对象fetch https developer mozilla org en US docs
  • 如何在 Ruby 中生成 n 个唯一随机数的列表?

    这是我到目前为止所拥有的 myArray map rand max 然而 显然有时列表中的数字并不唯一 如何确保我的列表仅包含唯一的数字 而不必创建一个更大的列表 然后我只需从中选择 n 个唯一的数字 Edit 我真的很希望看到这个没有循环
  • 内部测试时 ITSAppUsesNonExemptEncryption 导出合规性?

    我在选择内部测试构建时收到此消息 它说有关设置ITSApp 使用非豁免加密在info plist中是什么意思 有必要吗 基本上
  • 无法查看 plunker 结果

    突然 当我从过去 4 天开始尝试运行时 我的一些笨蛋出现了以下错误 statusCode 404 error Not Found 请参考我的一个笨蛋http plnkr co edit wWJx3zU3Sm1cN9ZCtvoh p prev
  • 更新在 dynamodb 中添加属性的项目

    dynamodb 中不能动态添加属性吗 当我尝试时 我得到了这个错误 提供的关键元素与架构不匹配 设想 id 123 imageName elephant jpg 我想向上述数据添加一个属性 imagePath path to image