Используйте 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 }}