mysql - 尝试在 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 包,这可能是问题的根源吗?
解决方案
您需要更改为,.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] 发送!''
推荐阅读
- arrays - 如何在 swift 中一次在 Firestore 文档中设置多个字段
- java - 在 setOnEditCommit JavaFX 之后禁用 TableCell
- r - Jtools-错误消息-没有适用于“summ”的方法应用于类“list”的对象
- android - Android 自定义 SeekBar - 进度不跟随拇指
- java - 如何使用 Gradle 安装 Aspose.Words for Java
- java - javac:没有源文件
- r - 如何将具有相似变量名称的多个数据框组合成一个数据框?
- php - Carbon:在 Carbon::parse 中允许时间戳
- c# - 将 ComboBox 与整数集合绑定
- flutter - 如何在颤振中使用 lerp() 方法以及用例是什么?