複数のレコードを挿入する必要があるシナリオがあります。id(他のテーブルからのfk)、key(char)、value(char)などのテーブル構造があります。保存が必要な入力は、上記のデータの配列です。例:次のような配列オブジェクトがあります。
lst = [];
obj = {};
obj.id= 123;
obj.key = 'somekey';
obj.value = '1234';
lst.push(obj);
obj = {};
obj.id= 123;
obj.key = 'somekey1';
obj.value = '12345';
lst.push(obj);
MS SQLでは、TVPを作成して渡しました。私はpostgresでどのように達成するのかわかりません。だから私がしたいのは、pg-promiseライブラリを使用して、リストのすべての項目を単一のクエリでpostgres sqlに保存することです。ドキュメントが見つからない、またはドキュメントから理解できない。助けてくれてありがとう。ありがとう。
私はpg-promiseの作者です。
複数のレコードを挿入する方法は2つあります。最初の最も一般的な方法は、トランザクションを使用して、すべてのレコードが正しく挿入されているか、どれも挿入されていないことを確認することです。
PG-約束、それは次のように行われます。
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
クエリプロミスを作成して、それらをすべてバッチとして解決します。
2番目のアプローチは、すべての挿入値を単一のINSERT
クエリに連結することです。これについては、パフォーマンスブーストで詳しく説明します。参照:pg-promiseによる複数行挿入。
その他の例については、タスクとトランザクションを参照してください。
添加
ほとんどの場合、レコードを挿入するのid
ではなく、自動的に生成することに注意してください。新しいIDを取得したい場合もあれば、気にしない場合もあります。
APIによると、バッチは個々の結果の配列で解決され、メソッドnoneはで解決されるnull
ため、上記の例は-s の配列で解決されます。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
});
つまり、変更は次のとおりです。
id
値は挿入しませんRETURNING id
クエリに追加して値を取得しますa => +a.id
自動行変換を行うために追加します。参照して文字列としてPG-約束リターン整数をそのものを理解する+
ためのものです。アップデート-1
単一のINSERT
クエリによる高性能アプローチについては、pg-promiseを使用した複数行の挿入を参照してください。
アップデート-2
必読記事:データインポート。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加