当前位置: 首页 > 知识库问答 >
问题:

当我使用复合主键时,为什么AWS Lambda返回“提供的键元素与模式不匹配”?

陶法
2023-03-14

我是AWS的新手,我正在尝试通过Lambda更新DynamoDB中的一个item属性。我尝试了Node.JS和Python中的代码,两次尝试都返回:

模块初始化错误:调用UpdateItem操作时发生错误(ValidationException):提供的键元素与架构不匹配

为什么会发生这种情况?这是我的表格信息:

  • 表名:高端假日拍卖
  • 主分区键:Aliyah_ID(字符串)
  • 主排序键:最高投标人(字符串)

所以我在代码中同时使用了分区键和排序键,所以我无法找出导致错误的原因

Lambda尝试与Python:

    from __future__ import print_function # Python 2/3 compatibility
            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-east-1')

            table = dynamodb.Table('High_Holiday_Auctions')

            AliyahID = "YK_MaftirHaftarah"
            HighestBidder = "unclaimed"

            response = table.update_item(
                Key={
                    'AliyahID': AliyahID,
                    'HighestBidder': HighestBidder
                },
                UpdateExpression="set HighestBidder = :h, CurrentHighBid =:c,                              
    LastHighestBidder=:l",
                ExpressionAttributeValues={
                    ':h': "Harry S Truman",
                    ':c': "100",
                    ':l': "unclaimed"
                },
                ReturnValues="UPDATED_NEW"
            )

            print("UpdateItem succeeded:")
            print(json.dumps(response, indent=4, cls=DecimalEncoder))

Lambda尝试使用Node.JS:

    const AWS = require('aws-sdk');
    const docClient = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});

    exports.handler = function index(event, context, callback) {
        var table = 'High_Holiday_Auctions';
        var   AliyahID = "YK_MaftirHaftarah";
        var  HighestBidder ="unclaimed"

            //updaate item unconditinoally
        var params ={
            TableName:table,
            Key:{
                "AliyahID": AliyahID,
            "HighestBidder": HighestBidder
            },
            UpdateExpression: "set HighestBidder =:h, CurrentHighBid =:c, LastHighestBidder=:l",
            ExpressionAttributeValues:{
                ":h":"George Burdell",
                ":c": "1000",
                ":l": "moe syslak"
            },

                ReturnValues:"UPDATED_NEW"
    };

    console.log("Updating the item...");
    docClient.update(params, function(err, data) {
        if (err) {
            console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
        }
    });
    };

类似的现有问题并没有完全回答我的问题:

  • 无法更新DynamoDB中的项目
  • Dynamodb用python boto3更新项目表达式
  • DynamoDB-Key元素与模式不匹配

共有1个答案

钱照
2023-03-14

除非您的表使用复合主键,否则只需在key字段中使用主分区键即可获取要更新的项。

我的猜测是,您试图更新该项的表配置了一个简单的主键。

 类似资料:
  • 我正在尝试使用boto和python删除DynamoDB表中的大量项。我的表是用主键作为设备ID(想想MAC地址)设置的。表中有多个设备ID条目,因为主键是UNIX时间戳。 从我的阅读代码应该工作: 来源:http://docs.pythonboto.org/en/latest/dynamodb2_tut.html#batch-writing 但是,它返回“提供的键元素与架构不匹配”作为错误消息。

  • 我在DynamoDB中创建了一个表“user\u info”,其中有一个主哈希键“user\u id”(String),没有范围键。然后,我创建了2个AWS lambda函数来插入和查询项目。我可以将项目插入表中,但查询表时,它会返回: ValidationException:提供的键元素与架构不匹配。 我的查询功能: 我一直得到这个例外: 自从 1) 我只有一个哈希主键。 2)user_id定义

  • 我正在尝试使用AWS Lambda函数将csv数据从S3写入DynamoDB。我当前收到以下错误“BatchWriteItem操作:提供的键元素与架构不匹配”。 这个问题有快速解决办法吗? 错误如下所示: 调用BatchWriteItem操作时发生错误(ValidationExc0019):提供的键元素与模式不匹配:ClientError Traceback(最近的调用最后一次): 文件“/var

  • 我的数据库中有两个表是通过复合主键/外键映射在一起的,我正花了一段时间让Hibernate来处理它们。我的数据库如下所示: TABLE1有一个由外键组成的复合主键,映射到TABLE_A和Table_B。TABLE2还有一个由外键组成的复合主键,映射到TABLE_A、TABLE_B和Table_D。在数据库中,TABLE2仅使用前两个外键映射回TABLE1。那里没问题。把它转换成冬眠真让我受不了。

  • 我正在尝试使用boto3从DynamoDB查询项目。 该表如下所示: DynamoDB表 我运行的代码是: 我错过了什么?

  • 当我执行这个查询时,我会得到以下异常