Rails5からAmazon Redshiftのクエリを実行

rails5からRedshiftへ接続するために次のライブラリを利用します。

activerecord5-redshift-adapter

activerecord5-redshift-adapterのインストール

Gemfileに activerecord5-redshift-adapter のgemを追加します

vi Gemfile
gem "activerecord5-redshift-adapter"

インストールします

bundle install

DB接続情報の設定

データベースの接続情報を database.yml に記載します。

vim config/database.yml
redshift:
  adapter: redshift
  database: testdb
  host: *********************.ap-northeast-1.redshift.amazonaws.com
  port: 5439
  username: testuser
  password: ************
  encoding: utf8
  pool: 5
  timeout: 30000

DB接続テストコード作成

単純にsample.userテーブルのレコードを1件取得するクエリを実行してみます。

require 'active_record'

class Tasks::ConnectRedshift

  def self.execute()
    ActiveRecord::Base.establish_connection(:redshift)
    ActiveRecord::Base.connection.execute "set search_path = '$user','public','sample';"
    result = ActiveRecord::Base.connection.execute "SELECT * FROM sample.member LIMIT 1"
    result.each{|record|
      p record
    }
  end
end
対象テーブルのスキーマを search_path にセットしておく必要があります

実行

1件のレコードが正しく出力されました。

bundle exec rails runner "Tasks::ConnectRedshift.execute()"
{"id"=>"12345", "name"=>"test12345", "created_at"=>"2019-06-01 11:21:16", "updated_at"=>"2019-06-01 11:21:16"}

最後に

古い情報から「activerecord-redshift-adapter」で接続を試してみましたがうまくいかず、
いろいろ調べるうちに「activerecord5-redshift-adapter」にたどり着きうまくいきました。

「set search_path」をしないと対象スキーマのテーブルが見れない点も最初はハマりました。
毎回 「set search_path」 やるのはなんか微妙ですね。
何かいい方法はないものか・・・