DynamoDBに複数項目を追加する

DynamoDBに複数項目を追加する:

備忘録としてまとめます。


はじめに

複数項目の追加をputとbatchWriteの2パターンの方法でやってみました。

AWS.DynamoDB.DocumentClientを使用します。

飲み物テーブル(DRINK)に飲み物名(name)と値段(price)の項目を追加します。

サンプルコードは関数内での使用を想定したものです。


put を使う

forでまわして1件ずつ追加をします。

const aws = require('aws-sdk'); 
const docClient = new aws.DynamoDB.DocumentClient(); 
 
function put() { 
    var promise = new Promise(function (resolve) { 
        // 追加するアイテムたち 
        var items = [ 
            { name: 'コーヒー', price: 230}, 
            { name: '紅茶', price: 230}, 
            { name: 'オレンジジュース', price: 210} 
        ]; 
 
        // 1件ずつ追加する 
        for (var i = 0; items.length > i; i++) { 
            const params = { 
                TableName: 'DRINK', 
                Item: { 
                    name: items[i].name, 
                    price: items[i].price 
                } 
            }; 
 
            docClient.put(params, function (err, data) { 
                if (err) { 
                    console.log('[ERROR] ' + err); 
                    resolve(null); 
                } else { 
                    resolve(data); 
                } 
            }); 
        } 
    }); 
    return Promise.all([promise]); 
} 


batchWrite を使う

一度にたくさん追加できるbatchWrite さんです。

const aws = require('aws-sdk'); 
const docClient = new aws.DynamoDB.DocumentClient(); 
 
function put() { 
    return new Promise(function (resolve) { 
        // 追加するアイテムたち 
        var items = [ 
            { name: 'コーヒー', price: 230}, 
            { name: '紅茶', price: 230}, 
            { name: 'オレンジジュース', price: 210} 
        ]; 
 
        // 追加する項目のオブジェクト生成 
        var putRequest= []; 
        items.forEach(function (item) { 
            let obj= { 
                PutRequest: { 
                    Item: item 
                } 
            }; 
            putRequest.push(obj); 
        }); 
 
        // テーブルの指定・追加項目をセット 
        var params = { 
            RequestItems: { 
                DRINK: putRequest 
            } 
        }; 
 
        docClient.batchWrite(params, function (err, data) { 
            if (err) { 
                console.log('[ERROR] ' + err); 
                resolve(null); 
            } else { 
                resolve(data); 
            } 
        }); 
    }); 
} 
リクエスト構文(batchWriteに渡すparameterの部分)は以下です。

var param = { 
    RequestItems: { 
        "テーブル名": [ 
            { 
                PutRequest: { 
                    Item: { 
                        "項目名1": "値", 
                        "項目名2": "値" 
                    } 
                } 
            }, 
            { 
                PutRequest: { 
                    Item: { 
                        "項目名1": "値", 
                        "項目名2": "値" 
                    } 
                } 
            } 
        ] 
    } 
 } 

余談:batchWrite 失敗時
スループットによる追加失敗時はUnprocessedItemsにエラーデータ(未処理データ)が入ります。

項目名の指定ミスなどは追加前に拒否をされるためUnprocessedItemsではなくValidationExceptionとしてエラーに入ります。


感想

batchWrite の存在を知らずに無理くり put をしていましたが、とても便利ですね。

25件以上の追加エラーではUnprocessedItemsに入ると思ったのですが、でてきたのはValidationExceptionでした。大量追加の方法は使う機会ができたら調べてみようと思います。

コメント

このブログの人気の投稿

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-04-30 23:37:32 RSSフィード2021-04-30 23:00 分まとめ(42件)

投稿時間:2023-02-05 02:09:04 RSSフィード2023-02-05 02:00 分まとめ(9件)