为何在MySQL Workbench正常运行的SQL查询在Node.js中报错?
解决Node.js mysql库执行多SQL语句报错的问题
问题原因
- Node.js的
mysql库默认禁用多语句查询,你的SQL文件包含CREATE DATABASE、USE、CREATE TABLE三条独立语句,即便用换行替换空格把它们连在一起,本质还是多语句,触发语法错误。 - 该库默认关闭多语句支持是为了防范SQL注入风险,所以直接执行合并后的多语句会被拦截。
解决方案
方案1:启用多语句支持(谨慎使用)
在创建连接时添加multipleStatements: true配置,允许一次性执行多个语句:
var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : process.env.MYSQL_KEY, port: 3306, multipleStatements: true // 开启多语句支持 });
注意:此方法存在SQL注入风险,若查询包含用户输入内容,绝对不要使用。
方案2:拆分语句逐个执行(安全推荐)
将SQL文件中的语句拆分后,依次执行:
const mysql = require('mysql') const dotenv = require('dotenv') const fs = require('fs') dotenv.config() var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : process.env.MYSQL_KEY, port: 3306 }); connection.connect(function(err) { if (err) { console.error('error connecting: ' + err.stack); return; } console.log('connected as id ' + connection.threadId); }); // 拆分SQL语句并过滤空内容 const createQueries = fs.readFileSync('./queries/createdb.sql') .toString() .split(';') .filter(query => query.trim() !== ''); // 用async/await逐个执行 async function runQueries() { for (const query of createQueries) { await new Promise((resolve, reject) => { connection.query(query, (error) => { if (error) reject(error); else resolve(); }); }); } console.log('所有SQL语句执行完成'); } runQueries().catch(err => console.error(err));
额外优化
创建数据库后,可直接在连接配置中指定数据库,省去USE语句:
// 先创建无数据库的连接执行建库语句,再重新连接指定数据库 // 或者先确保数据库存在,直接在连接配置中添加: database: 'clients'
内容的提问来源于stack exchange,提问作者VictoriaStudios
相关产品推荐
相关产品推荐

