0

このプログラムを検討してください

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 の標準的なイテレーションのイディオムなので、もちろん機能します。

2 番目の呼び出しは、配列にパッケージ化された同じデータを一度に返す必要があります。配列に実際に含まれているのは、テーブルの最後の行です。

これはバグですか、それとも何か間違っていますか?

4

2 に答える 2

1

私もこれに出くわしました。DBI::Rowかなりの調査の結果、特定のステートメント ハンドに関連付けられた のすべてのインスタンスが同じメモリを参照していると判断しました。さらに悪いことに、複製または複製しても違いはありません。適切なコピーを取得する唯一の方法は、それを配列に変換すること.to_aです。これは、メソッドを失うことを意味します:(

私は ruby​​forge にバグレポートを提出するのに苦労しました - それが修正されると思うからではなく、髪を引っ張っている他の吸盤を助けるかもしれないからです.

于 2012-12-04T21:04:21.847 に答える
0

私もこれに出くわしました。かなりの調査の結果、特定のステートメント ハンドに関連付けられた DBI::Row のすべてのインスタンスが同じメモリを参照していると判断しました。さらに悪いことに、複製または複製しても違いはありません。適切なコピーを取得する唯一の方法は、メソッドを失うことを意味する .to_a を使用して配列に変換することです:(

私は ruby​​forge にバグレポートを提出するのに苦労しました - それが修正されると思うからではなく、髪を引っ張っている他の吸盤を助けるかもしれないからです。

実際、DBI から Sequel へのいくつかのスクリプトの変換が完了したところです。Sequel は、ORM タイプのアクセスと、dbi のような生の SQL のサポートの両方を許可するため、非常に見栄えがします。

翻訳は簡単でした。

于 2012-12-05T01:40:26.447 に答える