Rails:Mysql2::错误:命令不同步
我正在Rails中直接使用Model.connection运行一个MySQL存储过程。所有数据都正确插入数据库并按预期返回,但我在测试中遇到以下错误: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
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中进行了测试,效果非常好!非常感谢,这应该是经过验证的答案