使用NodeJS在MySQL中运行SQL文件

我正在使用nodejs的mysql插件,并且在做所有我需要的东西方面是非常棒的。

不过,我遇到了一个绊脚石。 我创build了一个MySQL提供程序来导出一个mysql池:

var mysql = require('mysql'); var mysqlPool = mysql.createPool({ host : '127.0.0.1', user : 'root', password : '' }); mysqlPool.getConnection(function(err, connection) { connection.query("INSERT INTO .... 

我可以select,创build,插入等所有罚款,但我遇到了一个任务,我想与大约10个不同的命令一起运行一个小的SQLstring。 我想过要做以下其中一项:

  1. 使用mysql对数据库执行一个SQL文件
  2. 运行query并启用multipleStatements

我已经写了一些代码来执行mysql作为一个subprocess,但我真的很乐意避免这样做:

 var cp = require("child_process"); var cmdLine = "mysql --user=autobuild --password=something newdb < load.sql"; cp.exec(cmdLine, function(error,stdout,stderr) { console.log(error,stdout,stderr); }); 

选项二的问题是我宁愿不为每个查询启用多个语句,只是这个特定的一个。 我曾想过创build一个新的连接,但只是想着可以做的其他方式。

TL; DR? 使用NodeJS和MySQL我怎样才能执行以下到数据库中:

 CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20) ); CREATE TABLE sofa (name VARCHAR(20), owner VARCHAR(20) ); CREATE TABLE table (name VARCHAR(20), owner VARCHAR(20) ); 

非常感谢任何分享他们想法的人

您可以使用名为multipleStatements的连接选项:

 // Works with the pool too. var connection = mysql.createConnection({multipleStatements: true}); 

然后,你可以传递这样的查询:

 connection.query('CREATE 1; CREATE 2; SELECT 3;', function(err, results) { if (err) throw err; // `results` is an array with one element for every statement in the query: console.log(results[0]); // [create1] console.log(results[1]); // [create2] console.log(results[2]); // [select3] }); 

看起来有一个这样的模块: execsql

这里是一个很大的.sql文件友好的方式来执行对MySQL的多个查询,而不使用multipleStatements属性和一个巨大的缓冲区。 请注意,这不是上传到mysql的最有效的方法。

 var mysql = require('mysql'); var fs = require('fs'); var readline = require('readline'); var myCon = mysql.createConnection({ host: 'localhost', port: '3306', database: '', user: '', password: '' }); var rl = readline.createInterface({ input: fs.createReadStream('./myFile.sql'), terminal: false }); rl.on('line', function(chunk){ myCon.query(chunk.toString('ascii'), function(err, sets, fields){ if(err) console.log(err); }); }); rl.on('close', function(){ console.log("finished"); myCon.end(); }); 

这将做的伎俩:

 var express = require("express"); var bodyParser = require("body-parser"); var mysql = require('mysql'); var fs = require('fs'); var app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(express.static(__dirname)); var defaultConnection = mysql.createConnection({ host : 'localhost', user : 'root', password : '', database: 'utpDatabase' }); function dbCall_file (endpoint, operation, settings, filename){ app.post(endpoint, function(request, response){ var data = request.body; var path = 'path/to/queries/' + filename var connection = (settings == 'default') ? defaultConnection : settings; var callback = function(arg){ var query = arg.replace(/{{[ ]{0,2}([a-zA-Z0-9\.\_\-]*)[ ]{0,2}}}/g, function(str, mch){ return data[mch]}); connection.query(query, function(err, rows){ if (!err){ var toClient = (operation == 'select') ? rows : {success: true}; response.send(toClient); } else { console.log(err); response.send({error: err, query: query}); } }); }; fs.readFile(path, 'utf8', function(err, data){ if (!err){ callback(data); } else { callback(err); } }); }); }; 

然后在你的.sql文件中将你的节点variables包含在双引号中 – 例如,如果你想从你的post调用中查询节点variablesdata.firstName的名字:

 SELECT * FROM users WHERE name={{ firstName }}