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:
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
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]
});
On dirait qu’il existe un module à cet effet: execsql
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();
});
Ç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 }}