带有快速数组参数的节点mysql批量插入

Posted

技术标签:

【中文标题】带有快速数组参数的节点mysql批量插入【英文标题】:Node mysql bulk insert with express array parameter 【发布时间】:2018-04-17 11:08:36 【问题描述】:

我遇到了需要在我的 Node 项目中使用批量插入的情况。

这当然已经在这里回答了:How do I do a bulk insert in mysql using node.js

但是,我有一个用于创建 api 的 express 项目。参数变成了一个数组,我在使用该数组进行批量插入时遇到了问题。每当我尝试使用该路由时,都会收到 Error: ER_WRONG_VALUE_COUNT_ON_ROW: Column count doesn't match value count at row 1 的错误消息

经过一番挖掘,我发现它试图插入:

['foo', 'bar', 'test']

当我需要插入时:

['foo']
['bar']
['test']

不管怎样,这是完整的代码:

路线

router.post("/", function (req, res, next) 
    db.query(
        "REPLACE INTO user (`Name`) VALUES (?)",
        [req.query.array],
        function (error, response) 
            if (error) throw error;

            console.log(response);
         
    )
);

路由调用者

let requestUrl = "http://localhost:3000/user?";

// External api request which returns a list of users
for (let i = 0; i < body.users.length; i++) 
    requestUrl += `array=$body.users[i]&`


let addUserRequest = 
    url: requestUrl,
    method: "POST"
;

request(addUserRequest, function (error, response, body) 
    console.log(body);
);

生成的url是:

http://localhost:3000/user?array=foo&array=bar&array=test

【问题讨论】:

【参考方案1】:

试试这个,

var datatoDB = [];
req.query.array.forEach(function(entry) 
    console.log(entry);
    datatoDB.push([entry]);
);

在这里,我们尝试将这个['foo', 'bar', 'test'] 转换为这个[["foo"], ["bar"], ["test"]]。 现在,在您的函数中使用 datatoDB。

router.post("/", function (req, res, next) 
    db.query(
        "REPLACE INTO user (Name) VALUES ?", 
        [datatoDB],
        function (error, response) 
            if (error) throw error;

            console.log(response);
         
    )
);

【讨论】:

所以你的方法更接近,它插入第一个值然后完成。然后,我再次回顾了我在帖子中提到的答案,并将其包装在另一个数组中,例如 [datatoDB],但返回了相同的列计数错误。 看来我的 sql 语法是错误的,我确实需要那组额外的括号。如果您可以更改答案以使查询显示为REPLACE INTO user (Name) VALUES ?, [datatoDB],我将很乐意接受它,以便帮助其他人解决类似问题。

以上是关于带有快速数组参数的节点mysql批量插入的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 快速批量插入

带有 BLOB 列的 MySQL 5.7 批量插入

带有字符编码的 Python MySQL 批量插入错误

带有自定义绑定的 JOOQ 批量插入

批量 MySQL 插入,一个主记录,一个带有外键的详细记录

使用JDBC在MySQL数据库中快速批量插入数据