sails.js在mysql中运行多个命令查询

时间:2016-01-14 22:29:49

标签: mysql sails.js waterline

我在sails.js上执行多个sql查询时遇到问题

我想从sails lift上的文件运行脚本。

我在/config/bootstrap.js

中写了一个自定义处理
module.exports.bootstrap = function(cb) {

  fs.readFile('SQL\\StoredProcedures\\MyProcedure.sql', 'utf8', function (err,data) {
    if (err) {

      console.log(err);
    }
    console.log(data);
    MyModel.query(data, function(err, records){
        if(err){
          console.log(err);
        }
    });
  });
  // It's very important to trigger this callback method when you are finished
  // with the bootstrap!  (otherwise your server will never lift, since it's waiting on the bootstrap)
  cb();
};

问题是,.query()函数不接受内部的多个查询。我的意思是,它在我的文件中确实接受了:

DROP PROCEDURE IF EXISTS `MyProcedure`;

但在我的文件中我不会接受:

DROP PROCEDURE IF EXISTS `MyProcedure`;
SELECT * FROM something;

有没有办法执行这个文件?

2 个答案:

答案 0 :(得分:0)

您可以拆分文件中的行,然后逐个运行所有查询吗?

var fs = require('fs');

module.exports = function (cb) {
    fs.readFile('SQL\\StoredProcedures\\MyProcedure.sql', 'utf8', function (err,data) {
        if (err) {
          sails.log.error(err);
          return cb();  // you have no queries to run
        }

        sails.log.info(data);

        var queries = data.split('\n');

        // async is injected into the global scope by sails, so no need to require it
        // if you don't need your queries to run in order, then you can use async.each
        // instead of async.eachSeries
        // https://github.com/caolan/async#each
        async.eachSeries(
            queries,
            function (query, cb) {
                MyModel.query(query, function (err, records) {
                    if (err) {
                        sails.log.error(err);
                        return cb();
                        // If you don't want other queries to execute in case of an error, then
                        // return cb(err);
                    }
                });
            },
            function (err) {
                if (err) { sails.log.error(err); }
                return cb();
            }
        );
    });
};

答案 1 :(得分:0)

这可以通过如下设置config/datastores.js来完成:

module.exports = {

  default: {
    multipleStatements: true
  }
}

通过将其添加到配置中,可以让Sails处理查询的解析和执行。

问题是默认情况下,Node MySQL驱动程序不允许一次运行多个查询。这是为了防止SQL注入。

有关更完整的解释,请参见@ sgress454的评论:https://github.com/balderdashy/sails/issues/4192