ruby 1.8.7 和 2.1 之间的 DBI 行/委托行为

Posted

技术标签:

【中文标题】ruby 1.8.7 和 2.1 之间的 DBI 行/委托行为【英文标题】:DBI Row / delegate behavior between ruby 1.8.7 and 2.1 【发布时间】:2015-03-08 12:22:05 【问题描述】:

我在 ruby​​ 1.8.7 中执行以下代码以从我的数据库中读取行:

require 'dbi'
db_conn_handle = DBI.connect("DBI:mysql:host=localhost;database=mydb;port=3306", "root")
sth = db_conn_handle.prepare("select accounts.id, accounts.name from accounts;")
sth.execute
info = sth.to_a
puts "Info: #info[0].class"
info.each do |x, y|
  puts "#x ... #y"
end

从输出中可以清楚地看出 info[0].class 是 DBI::Row。此代码在使用 ruby​​ 1.8.7 (rails 3.2.17) 执行时完美运行

当我尝试在 ruby​​ 2.1.5 / rails 3.2.17 中执行它时,它给出了以下错误:

/home/rjain/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/delegate.rb:392:in `__getobj__': not delegated (ArgumentError)
    from /home/rjain/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/delegate.rb:341:in `block in delegating_block'
    from /home/rjain/mac/query.rb:7:in `each'
    from /home/rjain/mac/query.rb:7:in `<top (required)>'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands/runner.rb:52:in `eval'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands/runner.rb:52:in `<top (required)>'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands.rb:64:in `require'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands.rb:64:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

文件 /home/rjain/mac/query.rb 粘贴在上面。我想了解导致此问题的 ruby​​ 2.1 和 1.8 之间的区别。这个问题的解决方法是什么?

【问题讨论】:

【参考方案1】:

这也是我们在使用 Ruby 1.8x 编写的代码时遇到的问题,在 2.1.0 中运行时会出现问题 /usr/lib/ruby/2.1.0/delegate.rb:392:in __getobj__': not delegated (ArgumentError) from /usr/lib/ruby/2.1.0/delegate.rb:341:inblock in delegating_block'

一旦我们找到上面的 jsc 注释,我们就修改了 dbi gem 文件夹中的文件 row.rb。再次,寻找以下部分:

 if RUBY_VERSION =~ /^1\.9/

并将其更新为

if RUBY_VERSION =~ /^1\.9/ || RUBY_VERSION =~ /^2/

之后,应用程序运行没有问题。

【讨论】:

【参考方案2】:

遇到了同样的问题,追查了问题。

在 gem 目录中找到 lib/dbi/row.rb。第 212 行或附近应为

        if RUBY_VERSION =~ /^1\.9/

修改为

        if RUBY_VERSION =~ /^1\.9/ || RUBY_VERSION =~ /^2/

【讨论】:

是否有人通过分叉 dbi 来合并此更改? 看起来没有,它甚至不再在 github 上,但我确实找到了:code.hollensbe.org/erikh-archive/ruby-dbi/src/branch/master,并注明它不再被维护。

以上是关于ruby 1.8.7 和 2.1 之间的 DBI 行/委托行为的主要内容,如果未能解决你的问题,请参考以下文章

无法在ruby 1.8.7-p374中安装宝石

请建议适当的附件插件/宝石用于 Rails 2.0.2 和 Ruby 1.8.7

gem install使用ruby 1.8.7,rbenv和其他本地宝石引发了分段错误

如何从 Ruby 1.9.2 降级到 Ruby 1.8.7 以运行 Rails 2.0.2

使用Ruby-2.4.1编码问题

ruby sifttter_1.8.7.rb