Ahs*_*ain 5 mysql stored-procedures sequelize.js sails.js
我在MySQL中创建了一个存储过程,它期望一些输入并返回一些输出.要在MySQL中调用存储过程,我正在运行
CALL createCoupon(1236,321, @message);
SELECT @message AS message
Run Code Online (Sandbox Code Playgroud)
并在消息对象中获取输出.
现在我需要在sequelize中称之为SP的情况.我正在研究sailsjs项目并使用sequelize模块进行排队.
我在config/db_config中创建了数据库连接,我的连接字符串是:
var sequelize = new Sequelize(db.name, db.user, db.pass, {
host: db.host,
dialect: "mysql", // or 'sqlite', 'postgres', 'mariadb'
port: 3306, // or 5432 (for postgres)
maxConcurrentQueries: 100,
pool: {
maxConnections: 50,
maxIdleTime: 2000
},
queue: true
})
Run Code Online (Sandbox Code Playgroud)
我在控制器中称它为:
var Sequelize = require('sequelize');
var sequelize = require('../../config/db_config').dbase;
function setCoupon(couponCode, userId, setCouponResponse) {
var createCouponSQL = "some raw query";
sequelize.query(createCouponSQL, null, {
raw: true
}).success(function(createCoupon) {
sails.log.info(createCoupon);
setCouponResponse(null, createCoupon);
}).error(function(err) {
sails.log.error(err);
setCouponResponse(err, null);
});
}
module.exports = {
'createCoupon': function(req, callback) {
setCoupon(req.param('coupon_code'), req.session.userSession, function(err, setCouponResponse){
})
}
}
Run Code Online (Sandbox Code Playgroud)
现在我需要在续集中调用SP,所以我只是尝试:
var createCouponSQL = "CALL createCoupon(1236,321, @message);";
createCouponSQL += "SELECT @message AS message";
sequelize.query(createCouponSQL, null, {
raw: true
}).success(function(createCoupon) {
sails.log.info(createCoupon);
setCouponResponse(null, createCoupon);
}).error(function(err) {
sails.log.error(err);
setCouponResponse(err, null);
});
Run Code Online (Sandbox Code Playgroud)
但sequlize触发错误:
Executing (default): CALL createCoupon(1236,321, @message);SELECT @message AS m
essage
error: Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near 'SELECT @message AS message' at line 1
at Query.Sequence._packetToError (C:\Users\asd\Desktop\CardCash P2\Website\
node_modules\mysql\lib\protocol\sequences\Sequence.js:30:14)
Run Code Online (Sandbox Code Playgroud)
我已经完成了一些研发,但是找不到任何适当的调用存储过程的东西,它将我的响应发送回@message,我需要执行另一个select语句来获得结果.
请指导我如何使用我连接数据库的方式正确地完成此操作.
谢谢.
虽然很晚了,但我们正在一个项目中做类似的事情。整个旅程看起来,
我们已经在各个 SQL 文件中创建了所有 SP,并且有一个部署步骤,该步骤将所有 SP 插入到数据库中,并从该特定位置获取它们。
所有 SP 基本上都是通过SELECT在 SP 末尾运行一条语句来返回的。并且在 SP 之外没有单独的选择。
所以像这样的基本结构
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_copy_cleansheet;
$$
CREATE PROCEDURE `take_over_the_world` (#Some Input Args)
BEGIN
DECLARE method_to_be_used VARCHAR(1000);
# Define how to take over the world,
# SET method_to_be_used = "Approach A";
...
...
SELECT method_to_be_used as Result;
END
Run Code Online (Sandbox Code Playgroud)
现在我们使用sequelize原始查询调用SP,
const query = 'CALL take_over_the_world(:someArg)';
return Model.sequelize.query(query,
{
replacements : { someArg},
type : Model.sequelize.QueryTypes.SELECT
})
.then((response) => {
//Access response here. Its of the form [{Result: /*How to take over*/}]
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切似乎都很完美:)
| 归档时间: |
|
| 查看次数: |
2168 次 |
| 最近记录: |