我有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]
。
答案 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。