How can I iterate through a MySQL result set?

匿名 (未验证) 提交于 2019-12-03 02:24:01

问题:

Here is the code I'm using:

# Run the query against the database defined in .yml file. # This is a Mysql::result object - http://www.tmtm.org/en/mysql/ruby/ @results = ActiveRecord::Base.connection.execute(@sql_query) 

In my View, here's what I do to see the values:

<pre><%= debug @results %></pre> Outputs: #<Mysql2::Result:0x007f31849a1fc0>  <% @results.each do |val| %>    <%= val %> <% end %> Outputs: ["asdfasdf", 23, "qwefqwef"] ["sdfgdsf", 23, "asdfasdfasdf"] 

So imagine I query something like select * from Person, and that returns a result set such as:

ID      Name      Age 1       Sergio    22 2       Lazlow    28 3       Zeus      47 

How can I iterate through each value and output it?

The documentation here is not useful because I have tried methods that supposedly exist, but the interpreter gives me an error saying that those methods don't exist. Am I using the wrong documentation?

http://www.tmtm.org/en/mysql/ruby/

Thanks!

回答1:

If you are using mysql2 gem then you should be getting the mysql2 result object and according to the docs you should be able to do the following

results.each do |row|   # conveniently, row is a hash   # the keys are the fields, as you'd expect   # the values are pre-built ruby primitives mapped from their corresponding field types in MySQL   # Here's an otter: http://farm1.static.flickr.com/130/398077070_b8795d0ef3_b.jpg end 

Checkout the documentation here

So in you case you can do the following

<% @results.each do |val| %>    <%= "#{val['id']}, #{val['name']}, #{val['age']}" %> <% end %> 

Edit: you seem to be referring to the wrong doc check the Mysql2 gems doc.



回答2:

You could try using ActiveRecord::Base.connection.exec_query instead of ActiveRecord::Base.connection.execute which returns a ActiveRecord::Result (available in rails 3.1+)

Then you can access it in various ways like .rows, .each, or .to_hash

From the docs:

result = ActiveRecord::Base.connection.exec_query('SELECT id, title, body FROM posts') result # => #<ActiveRecord::Result:0xdeadbeef>   # Get the column names of the result: result.columns # => ["id", "title", "body"]  # Get the record values of the result: result.rows # => [[1, "title_1", "body_1"],       [2, "title_2", "body_2"],       ...      ]  # Get an array of hashes representing the result (column => value): result.to_hash # => [{"id" => 1, "title" => "title_1", "body" => "body_1"},       {"id" => 2, "title" => "title_2", "body" => "body_2"},       ...      ]  # ActiveRecord::Result also includes Enumerable. result.each do |row|   puts row['title'] + " " + row['body'] end 


回答3:

Use :as => :hash:

raw = ActiveRecord::Base.connection.execute(sql) raw.each(:as => :hash) do |row|   puts row.inspect # row is hash end 


回答4:

Look for @results.fields for column header.

Example: @results = [[1, "Sergio", 22],[2, "Lazlow", 28],[3, "Zeus", 47]]

@results.fields do |f|   puts "#{f}\t"  # Column names end  puts "\n"  @results.each do |rows| # Iterate through each row   rows.each do |col| # Iterate through each column of the row     puts "#{col}\t"   end   puts "\n" end 

Hope it is helpful.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!