1

最新版本的“pg”gem 以随机顺序返回 db 查询列的结果是否正常?我希望'pg' gem 的行为方式与 mysql2 gem 相同,在通过命令行直接查询数据库时按照显示的顺序返回数据。也许我应该使用更好的宝石。下面我的结果示例是使用相同查询“select * from books”的结果

第一次执行:

"The Shining","9","7808","4156"
"Dune","15","4513","1866"
"2001: A Space Odyssey","15","4267","2001"
"The Cat in the Hat","2","1608","1809"
"Bartholomew and the Oobleck","2","1590","1809"

第二次执行:

"4156","The Shining","9","7808"
"1866","Dune","15","4513"
"2001","2001: A Space Odyssey","15","4267"
"1809","The Cat in the Hat","2","1608"
"1809","Bartholomew and the Oobleck","2","1590"

第三次执行:

"9","The Shining","7808","4156"
"15","Dune","4513","1866"
"15","2001: A Space Odyssey","4267","2001"
"2","The Cat in the Hat","1608","1809"
"2","Bartholomew and the Oobleck","1590","1809"

返回结果的代码:

confrom = PG::Connection.new(:user => <myuser>, :password => <mypw>, :port => 5432, :host => <myhost>, :dbname => 'booktown')
results = confrom.exec("select * from books")
results.each do |row|
  row.each_value do |x|
    puts x
  end
end
4

1 回答 1

5

我猜你正在使用 Ruby 1.8.X,其中哈希没有任何定义的顺序。我用 Ruby 1.9.3 尝试了类似的代码,pg每次都以相同的顺序出现。

在这里:

results.each do |row|
  #...
end

row将是一个简单的Hash. 因此,当您使用 Ruby 时row.each_value,您不能依赖xRuby 1.8 中以任何特定顺序出现的值;在 1.9 中,您应该x按插入顺序获取值。

但无论如何,所有这些都无关紧要:

  1. 您应该避免select * ...,除非您在数据库中手动浏览;您应该始终这样说select c1, c2, ...,以便您确切地知道您从数据库中获得了什么以及所有内容将以什么顺序出现。如果有人添加了列或列更改了位置,那么您的所有代码都会中断。
  2. 您有一个Hash输入,row因此您可以按名称访问结果,这比处理职位更容易且更不容易出错。
于 2012-09-05T21:39:26.553 回答