4

我正在努力使用 ruby​​ 的 mysql gem 并准备语句。
我希望得到与对结果相同each_hash的结果,但在准备语句中也不支持它。所以我带着这个可怕的烂摊子来了。

  stmt = @db.prepare("SELECT mat_id, name, qty FROM materials WHERE mat_id = ? ")

  #those 3 lines hurt my eyes
  res = stmt.execute(params[:id])
  mat_id, name, qty  =  res.bind_result(Integer, String, Integer).fetch
  @material = [mat_id: mat_id, name: name, qty: qty]

必须有更好的方法来获取结果并获取哈希数组。

一个更好的 mysql gem 可能是一个有效的答案。ORM 不是。

4

3 回答 3

2

看到评论,我仍然会发布 Sequel 链接作为答案:

http://sequel.rubyforge.org/

您根本不需要使用 Sequel 的模型部分。事实上,文档有一整节专门介绍 SQL 爱好者:

http://sequel.rubyforge.org/rdoc/files/doc/sql_rdoc.html

示例查询:

DB.fetch("SELECT * FROM albums WHERE name LIKE ?", 'A%') do |row|
  puts row[:name]
end
于 2013-06-13T10:26:00.567 回答
2

单线!

Hash[stmt.result_metadata.fetch_fields.map(&:name).zip( stmt.fetch )]

或者更健壮

row = stmt.fetch
Hash[stmt.result_metadata.fetch_fields.map(&:name).zip( row )] if row
于 2015-03-26T18:58:01.520 回答
1

根据http://tmtm.org/en/mysql/ruby/,结果有一个“each_hash”方法,但语句没有。真是蛋疼……

#A proxy for the statement class
class Stmt

  def each_hash
    fields = @target.result_metadata.fetch_fields.map do |f| f.name.to_sym end 
    @target.execute.each do |x| 
      hash = {}
      fields.zip(x).each do |pair|
        hash[pair[0]] = pair[1]
      end 
      yield hash
    end 
  end 

  def initialize(target)
    @target = target
  end 

  def method_missing(name, *args, &block)
    @target.send(name, *args, &block)
  end 
end

现在,您可以这样做:

Stmt.new(@db.prepare(...).execute(...)).each_hash do |x|
  puts x
end

您可以将每一行作为哈希循环。

我还没有测试过多次执行

于 2013-12-04T21:21:20.857 回答