首页 > 解决方案 > 尝试在 Node 中批量插入用户数组时出现问题

问题描述

我花了很多时间查看提供的关于如何使用 Node 进行批量插入的所有解决方案(特别是这里这里这里),但我仍然无法从用户列表中插入多行。

我的数组如下所示:

[ [ 'user 1' ], [ 'user 2' ], [ 'user3' ] ]

我的代码如下:

let insert_sql = "INSERT IGNORE INTO followers (username) VALUES (?)"
  await connection.execute(insert_sql, [users], function (err, result) {
    if (err) throw err
    console.log("Number of records inserted: " + result.affectedRows)
  })

但它只将所有用户插入一行......我正在使用 npm 和 mysql2 包,这可能是问题的根源吗?

标签: mysqlnode.jsnpm

解决方案


您需要更改为,.query()以便在客户端构建更长的查询或使用 .execute 并将插入数据序列化到单个参数(例如,使用 JSON 字段和存储过程)或在查询文本中使用匹配数量的占位符let insert_sql = "INSERT IGNORE INTO followers (username) VALUES (?, ?, ?)"; await connection.execute(insert_sql, [users])

这是我解释执行与查询之间差异的答案,以“为什么 IN ?不与执行一起工作?” 问题:

.execute() 在后台执行准备 + 执行命令

查询与逐步执行:

询问:

在客户端格式化 sql: 'SELECT id FROM mytable WHERE id IN (?)' + [ [1,2,3] ] 变成 'SELECT id FROM mytable WHERE id IN (1, 2, 3)' send COM_QUERY command with ' SELECT id FROM mytable WHERE id IN (1, 2, 3)' 读取字段 + 行执行:

使用 SELECT id FROM mytable WHERE id IN (?) 发送 COM_PREPARE 命令作为查询参数读取准备好的语句结果(如果从查询中知道,则为 id + 参数 + 结果字段)。对于这个查询,有一个参数(一个?)。id 是一个数字,通常每个连接都以 1 开头(不是唯一的服务器,您不能在一个连接中准备语句并在另一个连接中使用)使用语句 id + 参数发送 COM_EXECUTE 命令。参数必须是简单的 mysql 类型,目前所有参数都被强制转换为字符串并序列化为字符串(Buffer 参数除外,它们按原样发送)。在您的示例中是“请使用 id 1 和一个参数执行 stmt,该参数是字符串“1,2,3” 上面准备步骤的结果被缓存,下一个执行具有相同查询的命令仅 'COM_EXECUTE'

我同意这令人困惑,但这就是准备好的声明的工作方式。我们应该通过更好的文档和一些参数验证警告/错误来改进这一点,例如 _"hey,您确定要将 {foo: 'bar'} 参数发送到准备好的语句吗?它将作为 [Object object] 发送!''


推荐阅读