[*Rails*] 開発環境用DBをSQLite3からPostgreSQLに変更する　

はじめに
==
[*Ruby on Railsチュートリアル*](http://railstutorial.jp/)の[*第3章 ほぼ静的なページの作成の演習3*](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-static_pages_exercises)の、開発環境のDBをSQLite3からPostgreSQLに変更する演習についてやってみたのでまとめる。
環境は以下の通り。

* CentOS6.5(Vagrant)
* Ruby2.0.0
* Rails4.0.5

手順
==
Gemfileは以下。（Railsチュートリアルに記載してあるものと同じ）

```ruby:Gemfile
source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.5'
gem 'pg', '0.15.1'

group :development, :test do
  gem 'rspec-rails', '2.13.1'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
end

gem 'sass-rails', '4.0.5'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails', '3.0.4'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'rails_12factor', '0.0.2'
end
```

`config/database.yml`の`development`を以下のように修正。

```ruby:config/database.yml
development:
  adapter: postgresql
  host: localhost
  encoding: utf8
  database: psgr_db
  username: postgres
  password: postgres
  pool: 5
  timeout: 5000
```

以下実行。

```bash
$ bundle update
```

こんなエラーが出たら、

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

ひとまずエラーのアドバイスに従って以下実行。

```bash
$ gem install pg -v '0.15.1'
```

もう一回`bundle update`するとこんなエラーが出るので

```
Building native extensions. This could take a while...
ERROR: Error installing pg:
ERROR: Failed to build gem native extension.

/home/vagrant/.rvm/rubies/ruby-2.0.0-p598/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
*** 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.
...省略...
```

以下を実行。その後`bundle update`してもエラーは出なくなる。

```bash
$ sudo yum install postgresql-devel
```

その後以下を実行して、

```bash
$ sudo yum install postgresql-server
```


`postgres`ユーザーのパスワードを変更して、

```bash
$ sudo passwd postgres
```

`postgres`ユーザーに切り替えて

```bash
$ su postgres
```

データベースの初期化。

```bash
$ initdb -D /var/lib/pgsql/data
```

こんなのがバーっと出る。

```
could not change directory to "/home/vagrant/rails/railsTutorial/sample_app"
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale ja_JP.UTF-8.
The default database encoding has accordingly been set to UTF8.
initdb: could not find suitable text search configuration for locale ja_JP.UTF-8
The default text search configuration will be set to "simple".

fixing permissions on existing directory /var/lib/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /var/lib/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

postgres -D /var/lib/pgsql/data
or
pg_ctl -D /var/lib/pgsql/data -l logfile start
```

下の方に書いてあるやつを実行。logfileつけたら怒られたので以下実行。

```bash
$ pg_ctl -D /var/lib/pgsql/data start
```

もとのユーザーに戻ってデータベースを作成してみる。

```bash
$ rake db:create RAILS_ENV=development
```

もう1回`postgres`ユーザーに切り替えて出来てるか確認。
**psgr_db**という`config/database.yml`で指定したDBができてる。

```bash
$ su postgres
$ psql -l
                                  List of databases
   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges  
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 psgr_db   | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
(4 rows)
```

適当にモデル作って`rake db:migrate`やって`rails console`からデータを入れて、DBの中見てみたらちゃんとデータが入っていた。（idが2のデータがコンソールから入れたやつ）

```bash
$ su postgres
$ psql psgr_db postgres
$ select * from static_pages;
 id | name  | age |         created_at         |         updated_at         
----+-------+-----+----------------------------+----------------------------
  1 | test  |  20 |                            | 
  2 | test2 |  30 | 2015-01-05 15:27:37.290788 | 2015-01-05 15:27:37.290788
```