草庐IT

mysql - 在 Sequelize 中调用输入/输出类型的存储过程

coder 2023-10-06 原文

我在 MySQL 中创建了一个存储过程,它需要一些输入并返回一些输出。 在我正在运行的 MySQL 中调用存储过程

CALL createCoupon(1236,321, @message);
SELECT @message AS message

并在消息对象中获取输出。

现在出现了我需要在 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
})

我在 Controller 中这样调用它:

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){

        })

    }
}

现在我需要在 sequelize 中调用 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);
    });

但是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)

我已经进行了一些研发,但无法找到任何适合调用存储过程的方法,该存储过程在@message 中将响应发回给我,我需要执行另一个选择语句来获取结果。

请指导我如何使用连接数据库的方式正确执行此操作。

谢谢。

最佳答案

虽然很晚了,但是我们正在做一个项目中类似的事情。 整个旅程看起来像,

我们已经在单独的 SQL 文件中创建了所有 SP,并且有一个部署步骤,将所有 SP 插入数据库,从特定位置获取它们。

所有 SP 基本上都是通过在 SP 末尾运行 SELECT 语句来返回的。并且在 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

现在我们调用 SP 使用 sequelize 原始查询,

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*/}]
});

到目前为止一切似乎都在完美地工作:)

关于mysql - 在 Sequelize 中调用输入/输出类型的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30643415/

有关mysql - 在 Sequelize 中调用输入/输出类型的存储过程的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  5. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  6. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  9. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  10. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

随机推荐