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

时间:2015-08-21 10:26:35

标签: mysql ruby-on-rails ruby activerecord

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

  1. ActiveRecord :: StatementInvalid:Mysql2 :: Error:命令不同步;你现在不能运行这个命令:ROLLBACK

  2. ActiveRecord :: StatementInvalid:Mysql2 :: Error:命令不同步;你现在不能运行这个命令:BEGIN

  3. 暂定1:

    Model.connection.begin_db_transaction
    result = Model.connection.select_value("CALL myStoredProcedure(...);")
    Model.connection.commit_db_transaction
    

    暂定2:

    result = Model.connection.select_value("CALL myStoredProcedure(...);")
    Model.clear_active_connections!
    

    暂定3:

    {{1}}

    暂定#3导致“ActiveRecord :: StatementInvalid:Mysql2 :: Error:命令不同步;您现在无法运行此命令:BEGIN”消失。命令ROLLBACK的错误仍然存​​在。

    我做错了什么?

    由于

2 个答案:

答案 0 :(得分:3)

我怀疑你的模型的连接正试图同时运行冲突的查询。不要使用Model.connection.select_value,请尝试使用ActiveRecord::Base.connection.execute

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

答案 1 :(得分:0)

使用Rails v4.2和MySQL2 v0.4.5我发现几乎所有文档化的解决方案都不起作用。我也不喜欢在活动连接上调用clear的想法。所以我经历了一些事情。首先,我尝试以最支持的方式为多个语句设置连接/查询标志,我可以通过阅读源来找到它,这是一个简单的初始化器。

Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::MULTI_STATEMENTS

这样工作正常,我可以验证标志已设置,但是,这并没有解决我的问题。我在一些非常基本的过程中得到了不同步错误。所以我接受了使用abandon_results的工作!方法并将其包装成一个类似于我在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 / function并获得基本结果。

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