代码之家  ›  专栏  ›  技术社区  ›  kk651

首先创建表,然后将项放入刚刚创建的表中

  •  0
  • kk651  · 技术社区  · 2 年前

    通过使用“2012-08-10”的API版本,我试图在DynamoDB上创建一个表。我的Lambda代码 groupID 通过API。创建表后,作为后续操作,我将尝试将第一项添加到表中,如下所示:

    const AWS = require('aws-sdk');
    AWS.config.update({ region: 'eu-central-1' });
    const dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
    
    exports.handler = (event, context, callback) => {
        var itemParams = {
            ...some itemParams
        });
    
        var tableParams = {
            ...some tableParams
        };
    
        dynamodb.createTable(tableParams, function (err, data) {
            if (err) { console.log(err, err.stack) }
            else { console.log("Table created", data); }
        });
    
        dynamodb.putItem(itemParams, function (err, data) {
            if (err) callback(null, err);
            else callback(null, data);
        });
    };
    
    

    不幸的是,我收到了一个“ResourceNotFoundException”错误。基本上putItem不识别刚刚创建的表。关于如何在这里创建触发器,有什么建议吗?有没有办法将Item放入刚刚创建的表中?非常感谢。

    此外,如果您想了解参数的详细信息:

    var tableParams = {
        AttributeDefinitions: [
            {
                AttributeName: "memberID",
                AttributeType: "S"
            }
        ],
        KeySchema: [
            {
                AttributeName: "memberID",
                KeyType: "HASH"
            }
        ],
        ProvisionedThroughput: {
            ReadCapacityUnits: 2,
            WriteCapacityUnits: 2
        },
        TableName: "plexiGr_" + event.groupID
    };
    
    var itemParams = {
        TableName: "plexiGr_" + event.groupID,
        Item: {
            "memberID": { S: event.groupAdmin },
            "memberName": { S: "Julius" },
            "memberAge": { N: "32" }
        },
        ConditionExpression: "attribute_not_exists(groupID)"
    };
    
    0 回复  |  直到 2 年前
        1
  •  1
  •   Nadav Har'El    2 年前

    发电机 CreateTable 手术是 异步的 -只是 开始 创建表,但在表的创建完成之前返回。这个 CreateTable document 解释说:

    编码表 是一个异步操作。收到通知后 编码表 请求时,DynamoDB立即返回一个带有 TableStatus 属于 CREATING .创建表后,DynamoDB设置 表状态 ACTIVE 。只能对活动表执行读写操作。

    换句话说,什么时候 编码表 完成后,该表还不可用:现在需要执行 DescribeTable ,等待表的状态变为 忙碌的 .只有这样你才能使用这张桌子。

    因为这是一个有用的循环,所以大多数AWS库都有一个自动循环的功能。我熟悉boto3库中的Python,但我认为nodejs也有类似的Python。或者你可以直接打电话 可描述 你自己

    重申一下,不管其他人怎么说,这是事实 足以等待 编码表 完成。它将比你真正使用桌子的时间要早得多。您还必须单独等待新表的状态更改为 忙碌的 .

        2
  •  0
  •   Jens    2 年前

    您不会等到创建表。用于创建表和将项放入其中的命令按顺序运行,但不等待回调。

    因此,要么将代码写入create table操作的回调中,要么使用承诺等待表被创建。

    dynamodb.createTable(tableParams, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            return;
        }
    
        dynamodb.putItem(itemParams, function(putItemErr, putItemData) {
            if (putItemErr) callback(null, putItemErr);
            else            callback(null, putItemData);
        });
    });
    

    使用承诺:

    await dynamodb.createTable(tableParams).promise();
    await dynamodb.putItem(itemParams).promise();