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

pg-promiseを使用した大規模なインサート

    更新

    次の記事を読むことをお勧めします:データのインポート

    pg-promise の作成者として 以前に公開されたものは実際には正義をしていなかったので、私は最終的に質問に正しい答えを提供することを余儀なくされました。

    大量の/無限の数のレコードを挿入するには、メソッドシーケンス 、それはタスクとトランザクション内で利用できます。

    var cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tableName'});
    
    // returns a promise with the next array of data objects,
    // while there is data, or an empty array when no more data left
    function getData(index) {
        if (/*still have data for the index*/) {
            // - resolve with the next array of data
        } else {
            // - resolve with an empty array, if no more data left
            // - reject, if something went wrong
        }        
    }
    
    function source(index) {
        var t = this;
        return getData(index)
            .then(data => {
                if (data.length) {
                    // while there is still data, insert the next bunch:
                    var insert = pgp.helpers.insert(data, cs);
                    return t.none(insert);
                }
                // returning nothing/undefined ends the sequence
            });
    }
    
    db.tx(t => t.sequence(source))
        .then(data => {
            // success
        })
        .catch(error => {
            // error
        });
    

    これは、パフォーマンスの観点と負荷の抑制の両方の観点から、データベースに大量の行を挿入するための最良のアプローチです。

    あなたがしなければならないのはあなたの関数getDataを実装することです indexに基づいて、アプリのロジック、つまり大きなデータの送信元に応じて シーケンスの中で、オブジェクトのサイズとデータの可用性に応じて、一度に約1,000〜10,000個のオブジェクトを返します。

    いくつかのAPIの例も参照してください:

    関連する質問:大量のクエリを伴うnode-postgres

    また、挿入されたすべてのレコードの生成されたIDを取得する必要がある場合は、次のように2行を変更します。

    // return t.none(insert);
    return t.map(insert + 'RETURNING id', [], a => +a.id);
    

    および

    // db.tx(t => t.sequence(source))
    db.tx(t => t.sequence(source, {track: true}))
    

    あまりにも多くのレコードIDをメモリに保持すると、過負荷が発生する可能性があるため、注意してください。



    1. SQLServerのDateTime列をDateTimeOffsetに移行します

    2. docker-entrypoint-initdb.dでスクリプトを実行した後、postgresの再起動を作成します

    3. なぜ外部キーを使用する必要があるのですか?

    4. サブクエリを使用したこのSQLクエリが非常に遅いのはなぜですか?