为什么 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+) 仍然不支持存储过程? 的相关文章

  • 使用函数的 SQL 查询 - 如何获取列表的最大计数

    如何查询 MAXIMUM COUNT 交易次数 我的代码如下 SELECT customer id COUNT customer id FROM rental GROUP BY customer id HAVING MAX COUNT cu
  • 仅使用 varchar 作为外键的 MySQL 表

    我有一个包含单个唯一 VARCHAR 512 字段的表 我想让另一个表保存对第一个表的外键引用 两个表都使用 InnoDB 如果我向第二个表添加 VARCHAR 512 键并在其上添加外键约束 512 字节长的数据是否会保存两次 如果是这样
  • 如何使用 form_for 将参数传递给控制器​​ ruby​​ on Rails

    我有一个用户模型和一个课程模型 用户登录后可以自己上传课程 但是 我希望管理员能够为用户上传 以防用户不够精明 我的想法是对用户上传和管理员上传使用相同的创建操作 并使用 if 语句 管理员将在用户 id视图页面中为他上传之前选择用户 然后
  • XP及PHP MYSQL 练级系统

    我已经查看了所有提出的问题和答案 但我似乎找不到最适合我的答案 我想做的是开发一个系统 当用户达到一定的 XP 限制时 系统会进入下一个级别 它显示了下一个 XP 之前需要多少 XP So lvl1 0 gt lvl2 256 gt lvl
  • Rails 中对多个域/子域的支持

    我有一个 Rails 应用程序 它的设置与 Tumblr 类似 也就是说 您可以选择 1 子域名托管 your username myapp com 2 域名托管 your username com 两者都会转发到使用我的应用程序创建的该用
  • 如何避免 nginx“上游发送太大的标头”错误?

    我正在运行 nginx Phusion Passenger 和 Rails 我遇到了以下错误 upstream sent too big header while reading response header from upstream
  • Rails 中 WHERE 子句中的 ALL 运算符

    关联关系如下图所示 InstructorStudent has many fees Fee belongs to instructor student 我想要获得在所有给定数组中具有每月详细信息的指导学生 如果其中任何一个中不存在每月详细信
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • 使用来自另一个的 SELECT 更新表,但字段为 SUM(someField)

    基本上我有这样的事情 UPDATE Table SET Table col1 other table col1 FROM Table INNER JOIN other table ON Table id other table id 问题是
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • Rails - 连接多个表

    我有以下型号 class Company lt ActiveRecord Base has many price movements has many goods movements end class PriceMovement lt A
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • rake cucumber 和 rake spec 始终使用“开发”环境

    我运行 Cucumber 和 RSpec 测试的 rake 任务始终使用我的development环境 以下是相关的配置文件 RAILS ROOT config environments cucumber rb Edit at your o
  • Rails error_messages 帮助器

    这是一段很常见的代码 First name br error messages是一个辅助方法 但我很难找到它的文档 为什么呢 我在这里找到它们 error messages 具有相同的参数错误消息 http apidock com rail
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • ODBC 链接表中突然开始出现写入冲突消息

    我有一个 mySQL 数据库 用于跟踪我们的项目并驱动我们的网站显示其信息 为了方便更新数据库 我设置了一个使用 ODBC 连接 MySQL ODBC 5 1 来编辑数据的访问数据库 过去几个月一直运行良好 没有出现任何问题 然而 昨晚用户
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • 使用 Paperclip 保存文件而不上传

    我有一个简短的问题 是否可以保存文件而不实际通过表单上传 例如 假设我正在查看电子邮件中的附件 并且我想使用回形针保存它们 我该怎么做呢 我是否必须在某处手动调用 save file 或类似的东西 任何帮助将非常感激 我有一个 rake 任
  • 如何将枚举作为字符串存储到rails中的数据库中

    如何在 ruby 中创建迁移 其中默认值是字符串而不是整数 我想将枚举存储到数据库中 但我不想将其存储为整数 因为这样对于另一个应用程序来说没有意义想要使用同一张桌子 我该怎么做default female 代替default 0 clas
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car

随机推荐