RubyonRailsでsqliteでなくてPostgresqlを使う時

Shunsuke Sawada

結構めんどくさかった。。
メモしておきます。
Vagrantを使って、Macbookのローカル環境で開発という状況。

RailsをApacheで動かす手順は下記を参照。
RubyonRailsをApacheとPassengerで動かす | Workabroad.jp

Vagrant, CentOS-6.4, Ruby2.0, Rails4.0, Postgresql9.3

Postgresqlをインストールと準備

yum install postgresql とするとバージョンが古いので、まずはそこから。

公式サイト
PostgreSQL: The world's most advanced open source database

Postgresql

[Download]をクリック。

Postgresql

linuxの中の[RedHat/CentOS/Fedora/Scientific] families Linuxをクリック。
飛んだ先のPostgreSQL Yum Repositoryを参考にします。

[repository RPM listing] をクリックしてからレポジトリリストのページへ。
PostgreSQL RPM Repository (with Yum)

Postgresql
使っているOSに対応するリンクをコピーする。

wgetでダウンロード

1
wget http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm

取得する

1
sudo rpm -ivh pgdg-centos93-9.3-1.noarch.rpm 

searchするといろいろ入ってるのが分かるはず

1
yum search postgresql93

Postgresql9.3をインストール

1
2
3
sudo yum install postgresql93
sudo yum install postgresql93-devel
sudo yum install postgresql93-server

バージョンを確認

1
psql --version

追記:
Postgresqlの初期化が抜けていました。
これ必要。

1
sudo service postgresql-9.3 initdb

Postgresqlスタート。

1
sudo /etc/rc.d/init.d/postgresql-9.3 start

サーバー起動時にPosgresqlも起動させる。

1
chkconfig postgresql-9.3 on

確認。

1
chkconfig --list postgresql-9.3

Postgresqlにpostgresユーザーで入ってみる。
postgresユーザーはデフォルトで作成されてます。

1
sudo -u postgres psql

こうなってるはず。
postgresql

postgresユーザーのパスワードを設定する。

1
postgres=# \password

ユーザーを追加する。

1
postgres=# create user yourname with password 'password';

作成したユーザーでデータベースを作成。

1
postgres=# create database my_database owner yourname;

Postgresqlを抜ける。

1
postgres=# \q

Postgresqlのユーザーはこんな感じになっている。
user: postgres / pass: xxxxx
user: yourname / pass: password

Railsを新規作成

-d postgresql のオプションを付けて、データーベースを指定する

1
rails new app_name -d postgresql

gem install pg をしろとエラーがでた。
でもね、
gem install pg をしたらエラーがでた。

1
2
3
4
5
6
7
8
9
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
    ERROR: Failed to build gem native extension.
    /home/vagrant/.rbenv/versions/2.0.0-p247/bin/ruby 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

--with-pg-config=/path/to/pg_config のオプションつけて試せと言われているので、そんなファイルがあるのか検索してみる。

1
2
sudo find / -name pg_config
 -> /usr/pgsql-9.3/bin/pg_config

再度トライ。

1
gem install pg -- --with-pg-config=/usr/pgsql-9.3/bin/pg_config

再度Rails生成をトライ。うまくいくはず。

1
rails new app_name -d posgresql

Postgresqlを調整

この時点でブラウザで確認してみると、Conection Error らしきものが出てる。
解決するにはpg_hba.confを編集する必要がある。

検索

1
2
sudo find / -name pg_hba.conf
 -> /var/lib/pgsql/9.3/data/pg_hba.conf

編集

1
sudo vi /var/lib/pgsql/9.3/data/pg_hba.conf

こんな感じに編集

1
2
3
local   all    postgres    peer
 ↓
local   all    all         md5

保存したらPostgresqlを再起動。

1
sudo /etc/rc.d/init.d/postgresql-9.3 restart

アパッチも再起動

1
sudo service httpd restart

ブラウザで確認してみると、Railsのデフォルト画面が見えるはず。

pgAdmin3で接続してみる

postgresql.confを編集する

検索

1
2
sudo find / -name postgresql.conf
 -> /var/lib/pgsql/9.3/data/postgresql.conf

編集

1
sudo vi /var/lib/pgsql/9.3/data/postgresql.conf
1
2
3
#listen_addresses = 'localhost'
を下記に変更(コメントアウト削除を忘れずに)
listen_addresses = '*'

pg_hba.confを編集
自分の環境ではここ。
/var/lib/pgsql/9.3/data/pg_hba.conf

sudo vi /var/lib/pgsql/9.3/data/postgresql.conf
Vagrantで設定しているローカル開発環境のIPが192.168.33.55だとすると、
下記の内容に変更する。

1
host    all    all    192.168.33.0/0    md5

保存したらPostgresqlを再起動。

1
sudo /etc/rc.d/init.d/postgresql-9.3 restart

アパッチも再起動

1
sudo service httpd restart

Vagrantを使っている場合はVagrantfileを編集する。

Vagrant停止
vagrant halt

Vagrantfile編集
vi Vagrantfile

下記追加。
config.vm.network :forwarded_port, guest: 5432, host: 15432

保存したらVagrant起動
vagrant up

これで、RailsがPostgresqlで動くし、pgAdmin3でもデータベースが確認できるはず。

pgAdmin3の使い方は探せばいろいろ出てくる。

追記:

RSpecのテストでエラーが出たら

rake test:prepare でエラーが出る。

1
2
3
4
rake test:prepare
rake aborted!
PG::InsufficientPrivilege: ERROR:  permission denied to create database
: CREATE DATABASE "yourDB" ENCODING = 'unicode'

Postgresqlで作ったユーザーに権限を与えてないからね。

postgresユーザーでログイン

1
psql -U postgres

Roleを確認してみる

1
postgres=# \\du
1
2
3
4
 Role name  |                   Attributes                   | Member of 
------------+------------------------------------------------+-----------
 postgres   | Superuser, Create role, Create DB, Replication | {}
 yourname   |                                                | {}

yournameユーザーに Create DB の権限を与えてあげればOK。

1
postgres=# alter role yourname createdb 

再度確認するとこうなってるはず。

1
2
3
4
 Role name  |                   Attributes                   | Member of 
------------+------------------------------------------------+-----------
 postgres   | Superuser, Create role, Create DB, Replication | {}
 shunwitter | Create DB                                      | {}

これで rake test:prepare がパスするかと。

43
Shunsuke Sawada

おすすめの記事

acts-as-taggable-on タグを表示させる順番を決めたい
Railsを4.2にバージョンアップしたら、Vagrantのローカル開発環境にアクセスできなくなった問題
Railsのバリデーションエラー後にレイアウトが崩れるとき