2012-06-16 24 views
0

考慮這一計劃Ruby的DBI SELECT_ALL給出了有趣的結果,當你問一個數組

require 'dbi' 

handle = DBI.connect('DBI:Mysql:tasks', 'root', 'stupid') 

handle.select_all('select * from tasks') do |row| 
    puts row.inspect 
end 

rows = handle.select_all('select * from tasks') 
puts rows.inspect 

select_all第一次調用傳遞一個塊,它使用通過表中的行進行迭代,就如同它的猜想。這是迭代的標準Ruby成語,所以它當然是有效的。

第二呼叫應返回相同的數據,但一次全部,封裝在一個數組。數組實際包含的是表格的最後一行!

這是一個錯誤,還是我做錯了什麼?

+0

[紅寶石DBI SELECT_ALL VS執行取/每精加工]的可能重複(http://stackoverflow.com/questions/8972379/ruby-dbi-select-all-vs-execute-fetch-each-finish) –

+0

@Michael絕對是重複的,但我認爲我的版本更清晰,因此更有可能得到回答。 –

回答

1

我也偶然發現了這一點。經過大量研究後,我決定每個與特定語句手關聯的DBI::Row實例都引用相同的內存。更糟的是,重複或克隆它沒有任何區別。獲得一個正確的副本的唯一方法是將其轉換爲一個數組與.to_a,這意味着你失去了方法:(

我不費吹灰之力就提交一份關於rubyforge的bug報告 - 不是因爲我認爲它會得到修復但是因爲它可能會幫助其他一些吸引人的人,他們會把頭髮拉出來

0

我也偶然發現了這一點經過大量研究後,我決定每個與特定語句手相關的DBI :: Row實例引用相同的內存。更糟糕的是DUP或克隆沒有區別。得到正確的複製的唯一方法是將其轉換爲與.to_a數組,這意味着你失去的方法:(

我煞費苦心地提交一份關於rubyforge的bug報告 - 這並不是因爲我認爲它會得到解決,而是因爲它可能會幫助其他吸引人的人。

事實上,我剛剛完成了將幾個腳本從DBI轉換爲續集。續集看起來非常好,因爲它允許ORM類型訪問以及支持像dbi這樣的原始sql。

翻譯很簡單。

+0

你需要合併你的兩個答案。 –

相關問題