Rails で PostgreSQL を使う(MySQL との比較)

ポイントは2点

Rails で PostgreSQL を用いる際の設定でのポイントは以下の2点です。

1. pg の gem を入れる

PostgreSQL を扱うための gem である pg をインストールする必要があります。Gemfile に gem 'pg' と書いて bundle install します。

MySQL の場合は mysql2 という gem をインストールしていたところです。

2. データベース設定ファイルの adapter に postgresql を指定する

config/database.yml に adapter として postgresql を指定します。

MySQL の場合は adapter: mysql2 と指定していた場所です。

development:
  adapter: postgresql
(以下略)

(参考)任意のスキーマを使用するように設定する方法

PostgreSQL の場合はデータベースの構造が「データベース→スキーマ→テーブル群」となっています。MySQL では「データベース→テーブル群」となっている部分です。

PostgreSQL では MySQL と比較して「スキーマ」の部分が追加されています。どのスキーマを使うかを明示的に指定するには、データベース設定ファイルの中に以下のように記述します。

development:
  database: foobar
  schema_search_path: hogefuga
(以下略)

これで、foobar というデータベースの hogefuga というスキーマが操作対象になります。テーブルを削除したり追加したりする際にはこのスキーマの配下で行われます。

しかしながら public ではないスキーマを用いていると、db:reset や db:migrate:reset などを実行した際にエラーが出ます。同コマンドがスキーマまでは自動作成してくれない(はず)だからです。

$ rails db:migrate:reset
(省略)
rails aborted!
ActiveRecord::StatementInvalid: PG::InvalidSchemaName: ERROR:  作成先のスキーマが選択されていません
LINE 1: CREATE TABLE "schema_migrations" ("version" character varyin...

したがって同コマンドを実行する場合は手動でスキーマを作り直す必要があります。あるいは Rake タスクを追加するとかでしょうか*1。

もろもろ考えると、規約から外れるような作りにするよりかは、素直に public スキーマを使うべきだと思います。

*1:試していないので断定できませんが……