くずきのblog

技術とか色々

LaravelでRedshiftを扱う

どうも、くずきです。Lineで「クリスマス」という単語打つたびに背景が変わってイライラしてます。
今回は、LaravelRedshiftを扱う方法についてメモります。

使用しているライブラリは、

  • Laravel 5.5
  • php7.1.1 (phpenv + phpbuild)

[準備] phpenv+php-buildでPostgreSQLのライブラリをいれる

RedsfhitではPostgreSQL JDBC/ODBCに基づいて構築されているため、接続の際にはPostgreSQLの接続のように使える。
自分の環境はphpenv + php-buildphpをすでにインストールしてしまっているため、php-buildを設定後、phpを最近インストールする。

vim ~/.phpenv/plugins/php-build/share/php-build/definitions/7.1.1

上記の設定ファイルに、

configure_option -R "--with-pdo-pgsql"
configure_option -R "--with-pgsql"

を追加する。
-Rを忘れないようにいれておこう。一番ハマったところだけど、以前別の方法でphp環境に似たようなライブラリをいれてたみたく、-Rオプションをつけないせいで上書きしてくれなくてずっとインストールされなかった。。

一応自分の設定全部のせておく。

# 2つ追加
configure_option -R "--with-pdo-pgsql"
configure_option -R "--with-pgsql"

install_package "https://secure.php.net/distributions/php-7.1.1.tar.bz2"
install_xdebug "2.5.0"
enable_builtin_opcache

設定が終わったらいつも通り、

phpenv uninstall 7.1.1
phpenv install 7.1.1
phpenv rehash

とやればインストールされる。

LaravelにRedshiftに接続先情報に追加

config/database.phpconnectionsの項目の中に、redshiftの接続先を追加。
ここらへんはLaravelでの一般的なデータベースの接続と変わらないため細かい説明は割合します。

'redshift' => [
    'driver' => 'pgsql',
    'host' => env('DB_REDSHIFT_HOST', '127.0.0.1'),
    'port' => env('DB_REDSHIFT_PORT', '5439'),
    'database' => env('DB_REDSHIFT_DATABASE', 'forge'),
    'username' => env('DB_REDSHIFT_USERNAME', 'forge'),
    'password' => env('DB_REDSHIFT_PASSWORD', ''),
    'charset' => 'utf8',
    'prefix' => '',
    'schema' => 'public',
    'sslmode' => 'prefer',
],

つづいて、.envにも追加

DB_REDSHIFT_HOST=xxx.ddddd.ap-northeast-1.redshift.amazonaws.com
DB_REDSHIFT_PORT=5439
DB_REDSHIFT_DATABASE=redshift
DB_REDSHIFT_USERNAME=redshift_user
DB_REDSHIFT_PASSWORD=password

LaravelからRedshiftを利用する

Laravelではすでにデータベースのマルチ接続に対応している。以下のリンクが詳しすぎて、そこみたほうがはやい。

fideloper.com

一応自分の使い方を載せておくと、

$users = DB::connection('redshift')->select('SELECT id, name FROM users');

のようにやることで接続している。
Eloquentに紐づけることができるため、できる人はそっちにしたほうが意識せずに使えるためそうしておこう。

まとめ

  • RedshiftはPostgreSQLのドライバで繋がる
  • php-buildの設定ファイルで-Rオプションを忘れずに
  • Eloquentに接続先を紐付けよう

悲しいことに準備のところに一番時間を使ってしまった。。