私は
複数のレコードを挿入する方法は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
});
メソッドINSERT
を作成します promiseをクエリし、それらをすべてバッチ
として解決します。 。
2番目のアプローチは、すべての挿入値を単一のINSERT
に連結することです。 クエリ。これについては、 PerformanceBoost
で詳しく説明しています。 。参照:pg-promiseを使用した複数行の挿入 。
その他の例については、タスク
を参照してください。 および
追加
ほとんどの場合、レコードid
を挿入しないことを指摘しておく価値があります。 、むしろ自動的に生成されます。新しいIDを取り戻したい場合もあれば、気にしない場合もあります。
上記の例は、null
の配列で解決されます -s、バッチ
のため 個々の結果の配列で解決し、メソッド none
null
で解決します 、APIによると。
新しいIDを生成し、それらをすべて元に戻したいと仮定しましょう。これを実現するには、コードを次のように変更します。
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
});
つまり、変更は次のとおりです。
-
id
は挿入しません 値 - メソッド
なし を置き換えます 1つ 、各挿入から1つの行/オブジェクトを取得する -
RETURNING id
を追加します 値を取得するためのクエリへ -
a => +a.id
を追加します 自動行変換を実行します。 pg-promiseが整数を文字列として返す も参照してください。 その+
が何であるかを理解する です。
更新-1
単一のINSERT
による高性能アプローチの場合 クエリは、pg-promiseを使用した複数行の挿入> 。
更新-2
必読の記事:データのインポート 。