2012-01-23 18 views
3

はDBIを使用するための私のサンプルコードです:ここでのRuby DBIのSELECT_ALL VS /実行フェッチ各仕上げ

dbh = DBI.connect("DBI:Mysql:host=#{server};database=mysql", user, pass) 
rows = dbh.select_all("SHOW TABLES") 

行は以下のように印刷されています。これは、最後に印刷され

[["user"], ["user"], ["user"], ["user"], ["user"], ["user"], ["user"], ["user"], 
["user"], ["user"], ["user"], ["user"], ["user"], ["user"], ["user"], ["user"], 
["user"]] 

mysqlデータベースのテーブルですが、レコードの総数は適切です。

私はこの、実行フェッチ/各仕上げシーケンスを使用して、以下のようなものならば:

sth = dbh.execute("SHOW TABLES") 
sth.each do |row| 
    rows << row[0] 
end 
sth.finish 

しかし、それはのような適切な結果を私に与える:

["columns_priv", "db", "func", "help_category", "help_keyword", "help_relation", 
"help_topic", "host", "proc", "procs_priv", "tables_priv", "time_zone", "time_z 
one_leap_second", "time_zone_name", "time_zone_transition", "time_zone_transitio 
n_type", "user"] 

が問題で私を助けて?

+0

私もこれに遭遇しました。私はRubyForgeのバグとしてログに記録しています。http://rubyforge.org/tracker/index.php?func=detail&aid=29513&group_id=234&atid=967 – SimonMayer

答えて

1

dbh.select_allは、各繰り返しで同じ行を生成する列挙子のインスタンスを返します。私が何を意味するかを理解するために、この擬似コードを参照してください:あなたはブロックせずにSELECT_ALLを使用している場合

def select_all(query) 
    db_row = Row.new 
    reader = @connection.execute_reader(query) 
    Enumerator.new do |yielder| 
    until reader.end? 
     db_row.populate_from(reader) 
     yielder.yield db_row 
     reader.next! 
    end 
    end 
end 

したがって、列挙子は基本的に同じdb_rowオブジェクトを生成され、返されます。

これは単なる推測ですが、真実は近くにあると私は信じています。

UPD:ここでのソースコードhttps://github.com/erikh/ruby-dbi/blob/master/lib/dbi/handles/statement.rb(fetchメソッドの定義を参照)は、@rowdupであるため、間違っていると言います。まあ、おそらくエラーが...スタックアップのどこかにある

+2

誰か(おそらくMySQL DBDまたは低レベルのドライバの内部)が再利用していますバッファ。 'dbh.select_all(" SHOW TABLES ")の場合は、map {| r | [r.object_id、r.first.object_id]} '最初のIDは変更されますが、2番目のIDは変更されません。 –

2

私が使用してMS SQL DBを照会するときと同じでもhappenningさDBI.connect("DBI:ODBC:Driver={SQL Server};...")

私の仕事の周りのforcably配列にDBI ::行を変換することでした。

sth = dbh.execute "..." 
begin 
    return sth.map{ |row| row.to_a } 
ensure 
    sth.finish 
end 

私は問題はバッファーの再利用を行うことであることを$ 1,000賭ける - underirable副作用を持っていた可能性のパフォーマンス "強化!

関連する問題