25

複数のレコードを挿入する必要があるシナリオがあります。ID(他のテーブルからのfk)、キー(char)、値(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 の単一のクエリでリストからすべての項目を保存することです。ドキュメントを見つけることができません/ドキュメントから理解できません。どんな助けでも感謝します。ありがとう。

4

1 に答える 1

44

私は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
    });

つまり、変更は次のとおりです。

  • id値を挿入しません
  • メソッドnoneoneに置き換えて、各挿入から 1 つの行/オブジェクトを取得します
  • RETURNING idクエリに追加して値を取得します
  • a => +a.id自動行変換を行うために追加します。pg-promise は整数を文字列として返すも参照して、その目的を理解して+ください。

更新-1

単一のINSERTクエリによる高パフォーマンスのアプローチについては、pg-promise を使用した複数行の挿入を参照してください。

更新-2

必読の記事: Data Imports

于 2016-03-26T10:35:19.360 に答える