私はpg-promiseの作者です。
複数のレコードを挿入するには、2 つの方法があります。最初の最も一般的な方法は、トランザクションを介して、すべてのレコードが正しく挿入されるか、まったく挿入されないことを確認することです。
pg-promiseでは、次のように実行されます。
db.tx(t => {
const queries = lst.map(l => {
return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of null-s
})
.catch(error => {
// ERROR
});
メソッドtxでトランザクションを開始し、すべてのINSERT
クエリ promiseを作成してから、それらすべてをbatchとして解決します。
2 番目のアプローチは、すべての挿入値を 1 つのクエリに連結することです。これについては、パフォーマンス ブーストINSERT
で詳しく説明します。参照: pg-promise を使用した複数行の挿入。
その他の例については、タスクとトランザクションを参照してください。
添加
ほとんどの場合、レコードを挿入せず、id
自動的に生成されることに注意してください。新しい ID を取得したい場合もあれば、気にしない場合もあります。
上記の例はnull
-sの配列で解決されます。これは、その API に従って、batchが個々の結果の配列で解決され、メソッドnoneが で解決されるためです。null
新しい id-s を生成し、それらをすべて元に戻したいと仮定しましょう。これを実現するには、コードを次のように変更します。
db.tx(t => {
const queries = lst.map(l => {
return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id',
l, a => +a.id);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of new id-s;
})
.catch(error => {
// ERROR
});
つまり、変更は次のとおりです。
更新-1
単一のINSERT
クエリによる高パフォーマンスのアプローチについては、pg-promise を使用した複数行の挿入を参照してください。
更新-2
必読の記事: Data Imports。