我在帆上执行多个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();
}
);
});
};