如何使用mysql结果集作为迭代器

时间:2013-11-06 14:17:31

标签: ruby

我使用mysql2/em类型从EventMachine代码查询我的数据库:

database.query("select * from `mytable`").callback {|rows|
    ...
}

通常我会使用rows.foreach方法迭代生成的行。但是现在我需要在某个事件发生时“按需”迭代行。类似的东西:

row = rows.get_next

这可能吗?

2 个答案:

答案 0 :(得分:0)

在我的事件机器项目中,当我需要数据库连接时,我使用ActiveRecord,因此抽象层的工作方式与Rails相同

这是一个使用bundler

的简单示例

的Gemfile

# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem 'eventmachine'
gem 'activerecord'
gem 'mysql2'

配置/ database.yml的

adapter: mysql2
encoding: utf8
reconnect: false
database: bd_coop
pool: 5
username: sps_admin
password: sps_admin_db
host: localhost

配置/ database.rb

database = YAML.load_file(File.expand_path('../database.yml', __FILE__))
ActiveRecord::Base.establish_connection(
  :adapter => database["adapter"],
  :database => database["database"],
  :password => database["password"],
  :host => database["host"],
  :username => database["username"]
)

LIB / model.rb

class Model < ActiveRecord::Base

  self.table_name = "model"

end

LIB / server.rb

require "active_record"
require File.expand_path('../../config/db_connection', __FILE__)

module EchoServer
  def receive_data data
     Model.create(:data => data)
     send_data Model.all
  end

end


EventMachine.run {
    puts "Server started"
    EventMachine.start_server "0.0.0.0", 8082, EchoServer
}

答案 1 :(得分:0)

这是我想出的:

EM.run {
  database.query('select * from mytable').callback {|rows|
    e = rows.to_enum

    loop {
      p e.next
    }
    EM.stop
  }.errback {|e|
    p e
    EM.stop
  }
}