为什么 Rails (3+) 仍然不支持存储过程?

2024-04-18

我熟悉 Ruby on Rails、DB(MS) 驱动程序和存储过程之间长期存在的又爱又恨的关系,并且自版本 2.3.2 以来我一直在开发 Rails 应用程序。

然而,每隔一段时间就会出现这样的情况:SP 是比在(慢得多的)应用程序级别上组合数据更好的选择。具体来说,运行组合了多个表中的数据的报告通常更适合 SP。

为什么存储过程与 Rails 或 MySQL gem 的集成仍然如此糟糕。我目前正在开发一个使用 Rails 3.0.10 和 MySQL2 gem 0.2.13 的项目,但据我所知,即使是最新的 Edge Rails 和 MySQL gem 0.3+ 在使用 SP 时仍然会发脾气。

过去和现在仍然存在的问题是,在调用 SP 后数据库连接会丢失。

>> ActiveRecord::Base.connection.execute("CALL stored_proc")
=> #<Mysql::Result:0x103429c90>
>> ActiveRecord::Base.connection.execute("CALL stored_proc")
ActiveRecord::StatementInvalid: Mysql::Error: Commands out of sync; 
[...]
>> ActiveRecord::Base.connection.active?
=> false
>> ActiveRecord::Base.connection.reconnect!
=> nil
>> ActiveRecord::Base.connection.execute("CALL proc01")
=> #<Mysql::Result:0x1034102e0>
>> ActiveRecord::Base.connection.active?
=> false

从技术上来说,这确实是一个很难解决的问题,还是 Rails 的设计选择?


Rails 支持存储过程。您收到的不同步错误是因为MULTI_STATEMENTSRails 中默认未启用 MySQL 标志。该标志允许过程返回 1 个以上的结果集。

有关如何启用它的代码示例,请参阅此处:https://gist.github.com/wok/1367987 https://gist.github.com/wok/1367987

存储过程在 MS SQL Server 中开箱即用。

我几乎在所有基于 mySQL 和 SQL Server 的 Rails 项目中都使用了存储过程,没有任何问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Rails (3+) 仍然不支持存储过程? 的相关文章

随机推荐