使用NodeJS在MySQL中运行SQL文件

Mar*_*ark 15 mysql node.js

我正在使用nodejs 的mysql插件,到目前为止我做的一切都很棒.

但是我遇到了一个绊脚石.我创建了一个导出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 ....
Run Code Online (Sandbox Code Playgroud)

我可以选择,创建,插入等都很好,但是我遇到了一个任务,我想在一起运行一个带有大约10个不同命令的小SQL字符串.我考虑过做以下其中一项:

  1. 使用mysql对数据库执行SQL文件
  2. 运行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);
});  
Run Code Online (Sandbox Code Playgroud)

选项二的问题是我宁愿不为每个查询启用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) );
Run Code Online (Sandbox Code Playgroud)

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

jmi*_*gov 26

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

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

然后,您可以传递以下查询:

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]
});
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法将查询流式传输到 mysql 连接中?此示例假设 multipleStatements 是一个可管理的缓冲区。 (2认同)

Jus*_*tin 6

这是一种大.sql文件友好的方式,可以在不使用multipleStatements属性和大量缓冲区的情况下以编程方式对 MySQL 执行多个查询。请注意,这不是上传到 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();
});
Run Code Online (Sandbox Code Playgroud)


Val*_*itz 5

看起来有一个用于此目的的模块:execsql

  • 运行 execsql 的示例代码时,出现“错误:调用退出后无法排队查询”。 (5认同)