使用api网关在dynamodb中插入多个记录

时间:2017-12-12 07:43:33

标签: aws-api-gateway

如何使用API​​网关的主体映射模板在dynamodb中插入多行?

我的代码输入是“xyz 1,abc 2”,其中包含有关要插入的2行的信息。

只存储了第二条“abc 2”的记录,我希望将两条记录都插入到表中。以下是我写的代码

#set($rawAPIData = $input.path('$'))
#set ($bulk = $rawAPIData.split(","))
{
"TableName": "tablename",
#foreach( $records in $bulk)
#set ($s = $records.split(" "))
"Item": {
    "col1": {
            "S": "$s.get(0)"
    },
    "col2": {
            "S": "$s.get(1)"
    }

}
#if( $foreach.hasNext ), #end
#end
}

我是新手,建议真有帮助

2 个答案:

答案 0 :(得分:2)

This AWS guide显示了如何使用API​​网关作为DynamoDB的代理。它与您尝试采用的方法类似。作为建议,最好让您的api一次只关注一行,而不是在,上拆分多个输入。例如,它会稍微简化您的模板,以发送类似于指南中的请求。

示例请求正文

{ 
  "col1": "xyz",
  "col2": "1"
}

模板(源自您的模板代码):

{ 
    "TableName": "tablename",
    "Item": {
      "col1": {
          "S": "$input.path('$.col1')"
          },
      "col2": {
          "S": "$input.path('$.col2')"
         }
    }
}

但是,如果您想坚持使用多个项目,BatchWriteItem文档值得一读。在这个例子之后,我认为这应该是你的身体模板:

#set($rawAPIData = $input.path('$'))
#set ($bulk = $rawAPIData.split(","))
{
  "RequestItems": {
    "tablename": [
      #foreach($records in $bulk)
      #set ($s = $records.split(" "))
      {
        "PutRequest": {
          "Item": {
            "col1": {
               "S": "$s.get(0)"
            },
            "col2": {
              "S": "$s.get(1)"
            }
          }
        }
      }
     #if( $foreach.hasNext ), 
     #end
    ]
  }
#end
}

答案 1 :(得分:0)

我使用了与@Gerand类似的方法,但我使用lambda解决了它。这是工作代码:

 'use strict';
    const AWS = require("aws-sdk");
    const dynamodb = new AWS.DynamoDB();

exports.handler = (event, context, callback) => { 

var data=event.data;
var bulk = data.split(",");
var toSave = [];
for(var i = 0; i < bulk.length; i++) {
    var s=bulk[i].split(" ");
    var item = {
      "col1": {
            S: s[0]
    },
    "col2": {
           S: s[1]
    }
    };
    toSave.push(item);
}

var items = [];
for(var i = 0; i < toSave.length; i++) {
    items[i] = {
        PutRequest: { Item: toSave[i] }
    }
}
 var params = {
    RequestItems: {
        'table_name': items
    }
};
 dynamodb.batchWriteItem(params, function(err, data) {
        console.log("Response from DynamoDB");
        if(err) console.log(err);
        else    console.log(data);
    });
};