Rails:Mysql2::错误:命令不同步

Rails:Mysql2::错误:命令不同步,mysql,ruby-on-rails,ruby,activerecord,Mysql,Ruby On Rails,Ruby,Activerecord,我正在Rails中直接使用Model.connection运行一个MySQL存储过程。所有数据都正确插入数据库并按预期返回,但我在测试中遇到以下错误: ActiveRecord::语句无效:Mysql2::错误:命令不同步;现在无法运行此命令:回滚 ActiveRecord::语句无效:Mysql2::错误:命令不同步;现在无法运行此命令:开始 暂定1: Model.connection.transaction do result = Model.connection.select_valu

我正在Rails中直接使用Model.connection运行一个MySQL存储过程。所有数据都正确插入数据库并按预期返回,但我在测试中遇到以下错误:

  • ActiveRecord::语句无效:Mysql2::错误:命令不同步;现在无法运行此命令:回滚

  • ActiveRecord::语句无效:Mysql2::错误:命令不同步;现在无法运行此命令:开始

  • 暂定1:

    Model.connection.transaction do
      result = Model.connection.select_value("CALL myStoredProcedure(...);")
    end
    
    暂定2:

    Model.connection.begin_db_transaction
    result = Model.connection.select_value("CALL myStoredProcedure(...);")
    Model.connection.commit_db_transaction
    
    暂定3:

    result = Model.connection.select_value("CALL myStoredProcedure(...);")
    Model.clear_active_connections!
    
    暂定的#3导致“ActiveRecord::StatementInvalid:Mysql2::Error:命令不同步;您现在无法运行此命令:BEGIN”消失。仍然存在命令回滚的错误

    我做错了什么


    谢谢

    我怀疑您模型的连接试图同时运行冲突查询。不要使用
    Model.connection。选择\u值
    ,尝试使用
    ActiveRecord::Base.connection。执行

    result = ActiveRecord::Base.connection.execute "CALL myStoredProcedure(...);"
    ActiveRecord::Base.clear_active_connections!
    

    使用Rails v4.2和MySQL2 v0.4.5,我发现几乎任何有文档记录的解决方案都不起作用。我也不喜欢对活跃的连接进行清除的想法。所以我做了一些事情。首先,我试着用最受支持的方式为多个语句设置连接/查询标志,这是通过读取源代码(一个简单的初始值设定项)可以找到的

    Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::MULTI_STATEMENTS
    
    这很好,我可以验证是否设置了标志,但是,这并没有解决我的问题。我在一些非常基本的过程中出现了不同步错误。所以我开始使用这些结果!方法,并将其包装到一个方法中,该方法看起来与我在SQL Server适配器中所做的工作类似

    ActiveRecord::ConnectionAdapters::Mysql2Adapter.class_eval do
      def execute_procedure(proc_name, *variables)
        vars = variables.map{ |v| quote(v) }.join(', ')
        response = execute "CALL #{proc_name}(#{vars})", 'Execute Procedure'
        response.each
      ensure
        raw_connection.abandon_results!
      end
    end
    
    现在有了它,就可以很容易地执行proc/函数并获得基本结果

    ActiveRecord::Base.connection.execute_procedure :appsptest, 'arg1'
    

    在Rails 5.2.3和mysql2 gem 0.4.10中进行了测试,效果非常好!非常感谢,这应该是经过验证的答案