Используйте NodeJS для запуска SQL файла в MySQL
Я использую плагин mysql для nodejs, и это фантастика, когда я делаю все, что мне нужно.
Однако я столкнулся с камнем преткновения. Я создал поставщика 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 ....
Я могу выбрать, создать, вставить и т.д. все хорошо, но я столкнулся с задачей, в которой я хотел бы запустить небольшую строку SQL с примерно 10 различными командами. Я подумал о том, чтобы выполнить одно из следующих действий:
- Выполнить файл SQL с помощью базы данных mysql
- Запустите a
query
и включите multipleStatements
Я написал код для выполнения mysql
в качестве дочернего процесса, но мне очень хотелось бы избежать этого:
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);
});
Проблема с вариантом два заключается в том, что я бы предпочел не включать multipleStatements для каждого запроса, а только один конкретный. Я думал о создании нового соединения, но просто думал о других способах этого. Это можно сделать.
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) );
Большое спасибо за каждого, кто разделяет их идеи.
Ответы
Ответ 1
Вы можете использовать опцию подключения 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]
});
Ответ 2
Похоже, для этой цели существует модуль: execsql
Ответ 3
Вот большой .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();
});
Ответ 4
Это сделает трюк:
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 файл оберните ваши переменные node в двойные завитки - например, если вы хотите запросить первые имена для node variable data.firstName из вашего почтового вызова:
SELECT * FROM users WHERE name={{ firstName }}