Search code examples
postgresqlpg-promise

Multi row insert into multiple tables in a transaction using pg promise


I am trying to perform a transaction using pg promise where I intend to insert multiple rows in multiple tables in the transaction. I am using pg promise helper methods to optimize the insert into each table but unable to concatenate all the queries together to perform only one query. Also would really appreciate if someone can point out if there is any way to further optimise the below code.

Currently I am getting an error that "Parameter 'queries' must be an array." on pgp.hlpers.concat

db.tx(async t => {          
            let customerDataArray = [];
            let campaignStatusArray = [];
            let messageDetailsArray = [];

            for(const customer of customerDetails)
            {

                const customerData = {
                    columna1: customer.x,
                    columnb1: customer.y"
                };

                const campaignStatus = {
                    columna2: customer.a,
                    columnb2: customer.b
                };
                
                customerDataArray.push(customerData);
                campaignStatusArray.push(campaignStatus);

                for (const message of customer.messages)
                {
                    const messageStatus = {
                        columna: message.x,
                        columnb: message.y
                    };
                    messageDetailsArray.push(messageStatus);
                }
            }
            
            const customerDataCs = new pgp.helpers.ColumnSet(['columna1', 'columnb1'], {table: 'customerdata'});
            const campaignStatusCs = new pgp.helpers.ColumnSet(['columna2', 'columnb2'], {table: 'campaignstatus'});
            const messageStatusCs = new pgp.helpers.ColumnSet(['columna', 'columnb'], {table: 'messageStatus'});
            
            const customerDataQuery = pgp.helpers.insert(customerDataArray, customerDataCs);
            const campaignStatusQuery = pgp.helpers.insert(campaignStatusArray, campaignStatusCs);
            const messageStatusQuery = pgp.helpers.insert(messageDetailsArray, messageStatusCs);

            const concatAllQueries = pgp.helpers.concat(customerDataQuery, campaignStatusQuery, messageStatusQuery);

            await t.none(concatAllQueries);

        })
            .then(() => {
                // success;  
            })
            .catch(error => {
              
            });
'''

Solution

  • You need to pass your queries to concat in a single array like so:

    const concatAllQueries = pgp.helpers.concat([ customerDataQuery, campaignStatusQuery, messageStatusQuery ]);