web-dev-qa-db-fra.com

Utilisez NodeJS pour exécuter un fichier SQL dans MySQL

J'utilise le plugin mysql pour nodejs et il est fantastique de faire tout ce dont j'ai besoin jusqu'à présent.

Cependant, j'ai rencontré une pierre d'achoppement. J'ai créé un fournisseur MySQL qui exporte un pool 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 ....

Je peux sélectionner, créer, insérer, etc. tout va bien, mais je suis tombé sur une tâche pour laquelle je voudrais exécuter une petite chaîne SQL avec environ 10 commandes différentes. J'ai pensé à faire l'une des choses suivantes:

  1. Exécuter un fichier SQL sur une base de données en utilisant mysql
  2. Exécuter une query et activer multipleStatements

J'ai écrit du code pour exécuter mysql en tant que processus enfant, mais j'aimerais vraiment éviter de faire ceci:

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);
});  

Le problème avec l'option deux est que je préférerais ne pas activer plusieurs déclarations pour chaque requête, uniquement celle-ci. J'ai envisagé de créer une nouvelle connexion, mais je pensais simplement à d'autres manières de le faire.

TL; DR? Sous NodeJS et MySQL, comment puis-je exécuter les opérations suivantes dans une base de données:

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) );

Merci beaucoup à tous ceux qui partagent leurs idées

13
Mark

Vous pouvez utiliser l'option de connexion appelée multipleStatements:

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

Ensuite, vous pouvez passer les requêtes comme celles-ci:

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]
});
24
jmingov

On dirait qu’il existe un module à cet effet: execsql

4
Valentin Heinitz

Voici un gros moyen convivial pour le fichier .sql d'exécuter plusieurs requêtes multiples sur MySQL sans utiliser la propriété multipleStatements et un tampon énorme. Notez que ce n'est pas le moyen le plus efficace de télécharger sur 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();
});
1
Justin

Ça fera l'affaire:

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);
            }
        });

    });
};

Ensuite, dans votre fichier .sql, encapsulez vos variables de nœud dans des doubles curlies - par exemple, si vous souhaitez interroger les prénoms de la variable de nœud data.firstName à partir de votre appel suivant:

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