2012-09-05 79 views
1

最新版'pg'gem以隨機順序返回db查詢列的結果是否正常?我希望'pg'gem的行爲與mysql2 gem的行爲相同,當通過命令行直接查詢數據庫時,它會按照它呈現的順序返回數據。也許我應該使用更好的寶石。下面我結果的這個例子是期運用同樣的查詢結果 「選擇從書本*」PG gem以隨機順序返回列

第一次執行:

"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 

回答

5

我猜你正在使用Ruby 1.8.X,其中哈希沒有任何定義的順序。我嘗試了與pg和Ruby 1.9.3類似的代碼,並且每次都以相同的順序出現。

在這裏:

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

row將是一個簡單的Hash。所以當你使用row.each_value時,你不能依賴你在Ruby 1.8中以任何特定順序出現的值x;在1.9中,您應該按照插入順序獲取您的x值。

但這一切真的不怎樣都無所謂:

  1. 你應該避免select * ...當你手動數據庫裏面閒逛除;你應該總是說select c1, c2, ...,這樣你就可以確切地知道你從數據庫中得到了什麼以及每個東西會出現什麼樣的順序。如果有人添加了一列或者列改變了位置,那麼你的所有代碼都會中斷。
  2. 您在row中有Hash,因此您可以通過名稱訪問結果,這比輕鬆使用職位更容易,更不容易出錯。
+0

完美。非常感謝您花時間回覆。 select語句只是爲了得到一些返回的數據,但我一定會聽到你的警告和我的生產語句。 –