【问题标题】:Multi row insert into multiple tables in a transaction using pg promise使用 pg promise 将多行插入到事务中的多个表中
【发布时间】:2022-01-28 11:28:17
【问题描述】:

我正在尝试使用 pg promise 执行事务,我打算在事务的多个表中插入多行。我正在使用 pg promise 辅助方法来优化插入每个表的操作,但无法将所有查询连接在一起以仅执行一个查询。如果有人能指出是否有任何方法可以进一步优化以下代码,我也将不胜感激。

目前我收到一个错误 “参数'查询'必须是一个数组。”在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 => {
              
            });
'''

【问题讨论】:

    标签: postgresql pg-promise


    【解决方案1】:

    您需要将查询传递给单个数组中的 concat,如下所示:

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

    【讨论】:

    • 您可以在此处查看文档:vitaly-t.github.io/pg-promise/helpers.html
    • 是的,先生,非常感谢
    • 你认为有更好的方法来进一步优化这个吗?
    • @SugarCode 1) 您不需要重新映射数据,您可以在 ColumnSet 内重新映射。并且 2) 您可以静态创建 ColumnSet 对象。
    • @SugarCode ColumnSet 构造函数支持其列的详细数据映射逻辑,您可以在其中映射到任何数据结构,无需进行您正在做的数据准备。
    猜你喜欢
    • 2016-09-15
    • 2016-07-14
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2018-12-09
    • 2023-03-16
    • 2016-08-15
    相关资源
    最近更新 更多