【问题标题】:Insert multiple rows using prepared statement使用准备好的语句插入多行
【发布时间】:2016-03-07 08:38:45
【问题描述】:

我有一个对象数组,每个对象都有多个属性。例如:

var obj = [{a : '1', b : '2'},{a : '3', b : '4'}];

为了匹配数据库表的顺序,我正在生成一个具有批量插入所需顺序的新数组。

var bulkInsert = function(arrData){
    var orderedData = [];
    arrData.forEach(function(obj){
        orderedData.push(obj.b + ',' + obj.a);
    });
    return orderedData;
};

现在,我想将输出的对象数组批量插入到 postgres 表中:

client.query("INSERT INTO sometable(b, a) VALUES" +
    " ($1, $2)", [orderedData], function (err, result) {
        if (err) {
            return handleError(err, client, done);
        }
    });

但是,这会引发错误:

error fetching client from pool { [error: bind message supplies 1 parameters, but prepared statement "" requires 2]

串行版本工作正常,如果每个插入情况都在一个循环中迭代,但对于更大的数组来说会很慢..

【问题讨论】:

  • [orderedData] 应该是 orderedData,因为该值已经是一个数组。否则,它需要 1 个变量而不是预期的 2 个变量,因此会出现错误。

标签: javascript arrays node.js postgresql bulkinsert


【解决方案1】:

尝试从数组中删除方括号。它已经是一个你不需要它们的数组了

【讨论】:

  • 我现在收到此错误:error fetching client from pool { [error: bind message supplies 4 parameters, but prepared statement "" requires 2]
【解决方案2】:

您应该将参数作为两个大小的数组传递。为了同时插入两行。尝试重复以下查询两次:

client.query("INSERT INTO sometable(b, a) VALUES" + " ($1, $2)", [1,2], function (err, result) { if (err) { return handleError(err, client, done); } });

client.query("INSERT INTO sometable(b, a) VALUES" + " ($1, $2)", [3,4], function (err, result) { if (err) { return handleError(err, client, done); } });

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2015-03-02
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多