Node.js中使用mysql2时如何向预编译INSERT语句传入变量
mysql2预编译INSERT语句传参错误修正方案
你代码中存在4个核心错误,修正后即可正常执行:
- 占位符
?不需要手动包裹单引号:mysql2会自动根据变量类型处理转义和引号包裹,手动加'?'会将占位符识别为普通字符串,无法匹配参数 - SQL语句末尾多了多余的
?,属于语法错误需要删除 - 匿名占位符
?对应的参数需传有序数组,若要传对象需改为命名占位符:字段名格式 - inquirer收集的字段名为全小写
firstname/lastname,取值时错误写为驼峰firstName/lastName,会导致取值为undefined
修正后写法(命名占位符+对象传参,更易维护)
function addEmployee() { inquirer .prompt([ { name: "firstname", type: "input", message: "输入员工名:", }, { name: "lastname", type: "input", message: "输入员工姓:", }, { name: "role", type: "list", message: "选择员工岗位:", choices: selectRole(), }, { name: "choice", type: "rawlist", message: "选择员工直属上级:", choices: selectManager(), }, ]) .then(function (val) { var roleId = selectRole().indexOf(val.role) + 1; var managerId = selectManager().indexOf(val.choice) + 1; db.query( // 使用命名占位符:字段名,对应传入的对象key "INSERT INTO employee (first_name, last_name, role_id, manager_id) values (:first_name, :last_name, :role_id, :manager_id)", { first_name: val.firstname, last_name: val.lastname, manager_id: managerId, role_id: roleId, }, function (err) { if (err) throw err; console.table(val); startPrompt(); } ); }); }
可选写法(匿名占位符+数组传参)
如果习惯用?作为占位符,按占位符顺序传参数数组即可:
db.query( "INSERT INTO employee (first_name, last_name, role_id, manager_id) values (?, ?, ?, ?)", [val.firstname, val.lastname, roleId, managerId], function (err) { if (err) throw err; console.table(val); startPrompt(); } )
额外注意:需保证
selectRole()和selectManager()返回的数组顺序和数据库中存储的id顺序完全对应,否则通过indexOf+1计算得到的roleId和managerId会出错。
内容的提问来源于stack exchange,提问作者smasherCoder
相关产品推荐
相关产品推荐

