【问题标题】:Insert multiple records in mysql using node.js fails使用 node.js 在 mysql 中插入多条记录失败
【发布时间】:2021-03-27 00:57:44
【问题描述】:

我正在尝试在 MySQL 表中插入多条记录,但无论我做什么,它都只插入一行。

这里是 node.js 代码:

let orderID = 15; //It is a foreign key. Noted it from the table. 
itemParams = [
        [ orderID, 'd', 34.6, '12', '123.jpeg' ],
        [ orderID, 'd', 30.6, '2', '456.jpeg' ]
];

let addOrderItems = await pool.query(`INSERT INTO orderitems (oid, description, weight, quantity, image_url) VALUES (?)`, itemParams);

当我在控制台记录 addOrderItems 时,affectedRows 计数为 1,因此我还在 Workbench 中检查了我的表以确保只添加了一行。 (oid 是外键)。表确实有一个自动递增的主键。

我在网上找到的查询在问号周围没有括号?但是当我删除括号时,我收到以下错误:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '19, 'd', 34.6, '12', '123.jpeg'' at line 1
    at Query.Sequence._packetToError (Z:\Jura_SaaS\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
    at Query.ErrorPacket (Z:\Jura_SaaS\node_modules\mysql\lib\protocol\sequences\Query.js:79:18)
    at Protocol._parsePacket (Z:\Jura_SaaS\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (Z:\Jura_SaaS\node_modules\mysql\lib\protocol\Parser.js:433:10)
    at Parser.write (Z:\Jura_SaaS\node_modules\mysql\lib\protocol\Parser.js:43:10)
    at Protocol.write (Z:\Jura_SaaS\node_modules\mysql\lib\protocol\Protocol.js:38:16)
    at Socket.<anonymous> (Z:\Jura_SaaS\node_modules\mysql\lib\Connection.js:88:28)
    at Socket.<anonymous> (Z:\Jura_SaaS\node_modules\mysql\lib\Connection.js:526:10)
    at Socket.emit (events.js:315:20)
    at addChunk (_stream_readable.js:309:12)
    --------------------
    at Pool.query (Z:\Jura_SaaS\node_modules\mysql\lib\Pool.js:199:23)
    at internal/util.js:297:30
    at new Promise (<anonymous>)
    at Pool.query (internal/util.js:296:12)
    at Z:\Jura_SaaS\routes\order.js:190:44
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  code: 'ER_PARSE_ERROR',
  errno: 1064,
  sqlMessage: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '19, 'd', 34.6, '12', '123.jpeg'' at line 1",
  sqlState: '42000',
  index: 0,
  sql: "INSERT INTO orderitems (oid, description, weight, quantity, image_url) VALUES 19, 'd', 34.6, '12', '123.jpeg';"
}

注意:我已经承诺 pool.query 这就是你看不到它的回调格式的原因。

【问题讨论】:

  • 请注意 mysql 是一个较旧的 npm 包。使用mysql2。你可以参考这个链接,我以前解决过。 stackoverflow.com/questions/64464555/…
  • 首先,您可能需要考虑将values(?) 更改为values(?,?....)
  • 好的,我先试试mysql2,但是插入数组的时候只打一个问号
  • 为什么会这样?我试过用一个问号,我也有类似的问题
  • 在插入一个元组/行时添加多个问号(与字段一样多)。如果要插入多个元组,您将提供一个列表列表,因此列表将与问号相关而不是列表中的项目,这是我经过反复试验得出的结论

标签: mysql node.js sql-insert mysql-error-1064


【解决方案1】:

嗯,我一直在使用类似的方法。除了我不是一次插入所有行而是通过在循环的每次迭代中执行查询来执行每一行的插入这一事实。

注意:我使用的是 MVC 服务器架构

这是代码。

  1. 控制器
module.export.multiInsert = async (req) => {
    const transferData = req.body.rows;
    let conn = await con.getConnection();

    for await (data of transferData) {
    try {
            await conn.beginTransaction();
           // code for insertion
            const data = await something.addData(conn, a, b, c);
    } catch (error) {
            conn.rollback();

            response.status = false;
            response.result = 'Error occured!'

            console.log(error)

    } finally {
            conn.release();
    }
}
  1. 型号
Class something{
static async addData(conn, a, b, c) {

        let params = [a,b,c];

        const [resData] = await conn.execute('INSERT INTO `table` (`a`,`b`,`c`) 
                          VALUES(?,?,?);', params);
        return { "status": resData };
    }
}
  1. 路线
router.post('/insert-a-lot-of-data', controller.multiInsert)

【讨论】:

  • 这个看起来不错,但是不贵吗?一次又一次地查询数据库?
  • 根据11718292 最好能减少对数据库的调用次数
  • 我最终对数据库进行了多次调用,因为批量插入对我来说不起作用
  • 还有另一种方法,但我不确定这是否正确。我们可以做的是通过在循环中附加所有参数并执行它来动态创建插入查询。不过我没试过
  • 是的,我想过这个问题,但那样会变得一团糟,不是吗?但我认为它可能是有效的
猜你喜欢
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2016-02-29
  • 1970-01-01
  • 2018-01-16
  • 2016-09-01
  • 2013-04-25
相关资源
最近更新 更多