我正在使用Model.connection直接在Rails中运行MySQL存储过程。所有数据都正确地插入到数据库中并按预期返回,但我在测试中遇到以下错误:
ActiveRecord :: StatementInvalid:Mysql2 :: Error:命令不同步;你现在不能运行这个命令:ROLLBACK
ActiveRecord :: StatementInvalid:Mysql2 :: Error:命令不同步;你现在不能运行这个命令:BEGIN
暂定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的错误仍然存在。
我做错了什么?
由于
答案 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'