是否有一种DB独立的方式来获取Ruby中的Db2 SQL结果?

时间:2015-08-25 22:06:44

标签: ruby db2 rails-activerecord

我有Rake代码,我从我店里的一些示例代码和其他程序员的建议中拼凑而成。它看起来或多或少如下:

class Ticket666StupidDb2Test < ActiveRecord::Migration
    def up
        lookup('WXYZ3529300')
    end

    def down
        puts "down, boy!"
    end

    def lookup(xiskid)
       qresult = exec_query("SELECT DISTINCT SNARK, GLOOPEE FROM VITA_XISK WHERE XISKID = '#{xiskid}'")
       while row = IBM_DB.fetch_array(qresult) do
           snark = row[0]
           gloopee = row[1]
           puts "snark = #{snark}; gloopee = #{gloopee}"
       end
    end
end
  • 有没有办法在获取数据时使用结果集列名,而不是整数索引?我查看http://rubyibm.rubyforge.org/docs/adapter/2.5.9/doc/ActiveRecord/ConnectionAdapters/IBM_DBAdapter.html并找到至少一个方法fetch_data,这似乎可以让人们引用列名,但每次尝试使用它都会产生错误,例如:

    rake aborted!
    undefined method `fetch_data' for #<ActiveRecord::ConnectionAdapters::IBM_DBAdapter:0x38c16c0>
    
  • 这段代码有什么问题,这是我的第一次尝试:

    x = exec_query("Select ... blah blah blah...")
    x.each do |row|
        puts row['SNARK']
    end
    

    这是根据http://api.rubyonrails.org/classes/ActiveRecord/Result.html中记录的内容建模的,但它失败了,但x.each未定义的类似例外。

  • 无论如何,我不得不诉诸IBM_DB.whathaveyou之类的东西让我觉得淫秽。要么IBM不相信制定符合标准的驱动程序(不是我使用Java JDBC的Db2驱动程序的经验),要么我不知道支持的,直接的方法是什么。

有人可以告诉我吗?

ruby -v返回ruby 1.9.3p545 (2014-02-24) [i386-mingw32]

1 个答案:

答案 0 :(得分:0)

x = exec_query("Select ... blah blah blah...")有什么问题?如果您的查询不符合SQL,那么您已经将自己绑定到DBM,并且当需要迁移到其他DBM时,将会有更多的工作。这是使用ORM,将代码与查询分开的重点。这也意味着您需要站起来用于开发,测试和生产的DB2实例,因为您的代码无法针对本地开发的SQLite,测试中的MySQL或PostgreSQL以及生产中的DB2等方案进行调整。一个好的ORM,这真的很容易。

根据我的经验,使用或重命名IBM_DB并不是一个重要问题。如果您不想调用它IBM_DB,请将该常量指定给另一个更加视觉上令人愉悦的常量。续集代码通常使用DB,但它取决于我们想要的内容。它只是一个保持连接信息的常量。

必须索引数组是使用fetch_array的结果。通常,我不是使用整数来标识字段,而是定义更具象征性/助记符的常量,并使用它们代替数字。但是,再一次,一个好的ORM可以很容易地使用基于表模式的类/模型,增加了方便性和可读性的层次,使您与丑陋的低级驱动程序的API隔离开来。

使用Active Record或Sequel查看。 Sequel很好地支持DB2,并且像Active Record一样强大,并且可以与Rails一起使用。两者都可以在非Rails脚本中很好地工作;续集是我最喜欢的,但YMMV。