sql >> データベース >  >> RDS >> PostgreSQL

pg-promiseで複数のレコードを挿入する

    私は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をクエリし、それらをすべてバッチ として解決します。 。

    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

    必読の記事:データのインポート




    1. 日付と時間によるDateTimeグループ

    2. postgresqlで緯度と経度で最寄りの場所を見つけます

    3. MySQLまたはMariaDB用のHAソリューションを作成する際の信頼性の低いネットワークへの対処

    4. MySQLのすべてのストアドプロシージャを削除するか、一時的なストアドプロシージャを使用します