読者です 読者をやめる 読者になる 読者になる

techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

RailsでPostgreSQLを使えるようにする(Cent OS 6)

Ruby on Rails PostgreSQL

RailsでPostgreSQLを利用しようと思ったら結構めんどくさかったので備忘録。

【環境】 Cent OS 6 Rails 5.0.0.1

まずはpgのgemをインストールするためにGemfileを編集します。
[Gemfile]

・・・略
# gem 'sqlite3'
gem 'pg', '~> 0.19.0'
・・・略

そしてbundlerでインストール。

$ bundle install

すると以下のようにエラーが。。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory: /opt/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pg-0.19.0/ext
/opt/rbenv/versions/2.3.1/bin/ruby -r ./siteconf20161116-14801-1v9o109.rb extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
--with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header

*** extconf.rb failed ***

Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/opt/rbenv/versions/2.3.1/bin/$(RUBY_BASE_NAME)
--with-pg
--without-pg
--enable-windows-cross
--disable-windows-cross
--with-pg-config
--without-pg-config
--with-pg_config
--without-pg_config
--with-pg-dir
--without-pg-dir
--with-pg-include
--without-pg-include=${pg-dir}/include
--with-pg-lib
--without-pg-lib=${pg-dir}/lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:
 /opt/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0-static/pg-0.19.0/mkmf.log
extconf failed, exit code 1

Gem files will remain installed in /opt/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pg-0.19.0 for inspection.
Results logged to /opt/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0-static/pg-0.19.0/gem_make.out

An error occurred while installing pg (0.19.0), and Bundler cannot continue.
Make sure that `gem install pg -v '0.19.0'` succeeds before bundling.
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

調べてみたところPostgreSQL関連のパッケージが足りないらしい。なんてこった。

# yum -y install postgresql-devel
# yum -y install postgresql-server

で必要そうなパッケージをインストールしてみましたが、、、

$ rails db:create
Your version of PostgreSQL (80420) is too old. Active Record supports PostgreSQL >= 9.1.
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "database"=>"TravelMaker_development"}
rails aborted!
Your version of PostgreSQL (80420) is too old. Active Record supports PostgreSQL >= 9.1.
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)

どうやらPostgreSQLのバージョンがtoo old。ActiveRecordが対応していないとのこと。 ということで最新のPostgreSQL 9.6をインストールするために、ここからRPMパッケージを個別に追加。

# yum -y localinstall https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm

以下を実行して改めて必要なパッケージ類をインストール。

# yum -y install postgresql96-devel
# yum -y install postgresql96-server

参考:http://lets.postgresql.jp/documents/tutorial/yum/yum

PostgreSQLのサービスを起動。

# service postgresql-9.6 initdb
# service postgresql-9.6 start

もう一度bundle installして無事成功!

次にRailsプロジェクトのdatabase.ymlを変更します。

$ rails new <プロジェクト名> -d postgresql

とかを実行すると、PostgreSQL用のデフォルトのdatabase.ymlが<プロジェクト名>/config/database.ymlに出来上がるので、 それをコピペしてきて環境に合わせて編集します。

編集できたらデータベースを作成し、マイグレーションしておきます。

$ rails db:create
$ rails db:migrate

無事マイグレーション成功です。