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



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

我想从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;

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

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

module.exports = {
  default: {
    multipleStatements: true
  }
}

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新