RubyonRailsでsqliteでなくてPostgresqlを使う時
結構めんどくさかった。。
メモしておきます。
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
[Download]をクリック。
linuxの中の[RedHat/CentOS/Fedora/Scientific] families Linuxをクリック。
飛んだ先のPostgreSQL Yum Repositoryを参考にします。
[repository RPM listing] をクリックしてからレポジトリリストのページへ。
PostgreSQL RPM Repository (with Yum)
使っている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
こうなってるはず。
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 がパスするかと。