うちのいぬ Tech Blog

Tech Blog of Uchinoinu/My dog

MacOSX YosemiteでRails4.xを動かして、Postgresと繋げるときのメモ

Rails4.2で作っていたプロジェクトをHerokuで運用していくことになりました。 しかし、さくらvpsAWSを想定していたこともあり、慣れたMySQLをこれまで使っていました。 そこでMySQLからPostgresへ移し替えることになりまして、その際起きたトラブルのメモを残します。

http://amantesdelsoftwarelibre.files.wordpress.com/2011/10/postgre.jpg

MacにPostgresをインストール

こんな感じで

設定変更

# MySQL.  Versions 5.0+ are recommended.
#
# Install the MYSQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
#

まず↑のあたりは削除しました。

default: &default
#  adapter: mysql2
  adapter: postgresql
  encoding: utf8
  pool: 5
#  username: root
  username: hoge
  password:
#  socket: /tmp/mysql.sock

development:
  <<: *default
  database: hoge_development

test:
  <<: *default
  database: hoge_test

production:
  <<: *default
  database: hoge_production
  password: <%= ENV['HOGE_DATABASE_PASSWORD'] %>
#gem 'mysql2'
gem 'pg'
gem 'rails_12factor', group: :production

あんまり変更するところはなかったですが、↑の様にしました。

rails s をしたらspringが怒るトラブル

Springを使っていたこともあり、rails sが通らなくなりました。

$ rails s
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
bin/rails:6: warning: already initialized constant APP_PATH
/Users/hoge/bin/rails:6: warning: previous definition of APP_PATH was here
Usage: rails COMMAND [ARGS]

The most common rails commands are:
 generate    Generate new code (short-cut alias: "g")
 console     Start the Rails console (short-cut alias: "c")
 server      Start the Rails server (short-cut alias: "s")
 dbconsole   Start a console for the database specified in config/database.yml
             (short-cut alias: "db")
 new         Create a new Rails application. "rails new my_app" creates a
             new application called MyApp in "./my_app"

In addition to those, there are:
 destroy      Undo code generated with "generate" (short-cut alias: "d")
 plugin new   Generates skeleton for developing a Rails plugin
 runner       Run a piece of code in the application environment (short-cut alias: "r")

All commands can be run with -h (or --help) for more information.

↓とかしてみましたが、うまくいかず。

$ rake rails:update:bin

ここをみたりしましたが、rbenvを入れ替えるといいとか。 めんどくさいので、とりあえずspringを消しました。

$ bin/spring binstub --remove --all

# GemfileからSpringの部分をコメントアウトして
$ bundle install

参考

これで rails s は通るようになりました。

rails db でのエラー

$ rails db
psql: FATAL:  role "hoge" does not exist

macのアカウント名であるhogeが、roleに登録されてないよってエラーが出ます。

Postgresに入る

postgresアカウントになる

$ sudo su - postgres
or 
$ sudo -u postgres -i

入る

postgres$ psql
psql (9.4.1, server 9.4.0)
Type "help" for help.

roleと権限を作成

現状確認

postgres-# \du
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}

roleと権限作成

Macで使うアカウントと同じ名前で行けば問題ないと思います。

postgres=# create role hoge createdb replication superuser createrole login
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}
 hoge      | Superuser, Create role, Create DB, Replication | {}

ここではhogeというロールを作成して、create db, replication, superuser, create role login(表示はされていませんが)の権限を与えています。 とはいえ、railsで使うだけなのであれば、create db, loginで事足りるんじゃないかなと思います。(一旦その権限でテストしてみましたが、問題ない感じがします)

ターミナルからも

ちなみに、postgresに入らなくてもコマンドラインでターミナルからも出来る様です。

postgres$ createuser -U postgres -P hoge createdb 

パスワードを忘れた場合

なおパスワードを忘れた場合はこちらから

railsからpostgresに接続

rake db:create

まずhoge_developmentデータベースを作らないといけません。

$ rake db:create

もしcreatedbの権限を与えてないとエラーがでます。

Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"utf8", "pool"=>5, "username"=>"hoge", "password"=>nil, "database"=>"hoge_development"}
PG::InsufficientPrivilege: ERROR:  permission denied to create database
: CREATE DATABASE "matcha_test" ENCODING = 'utf8'

Postgresで確認

$ sudo -u postgres -i
Password:
postgres$ psql
psql (9.4.1, server 9.4.0)
Type "help" for help.

postgres=# \l
                                 List of databases
        Name        |  Owner   | Encoding | Collate | Ctype |   Access privileges
--------------------+----------+----------+---------+-------+-----------------------
 hoge_development | hoge   | UTF8     | C       | C     |
 hoge_test        | hoge   | UTF8     | C       | C     |

↑できてます!

一応、チョクではいってみます↓

$ psql -U hoge -d hoge_development
psql (9.4.1, server 9.4.0)
Type "help" for help.

hoge_development=>

入れました!

rails db

railsのコマンドでやってみます。

$ rails db
psql (9.4.1, server 9.4.0)
Type "help" for help.

hoge_development=>

いいですね。

データが入るか確認

migrateやpryで見てみるといいです。

$ rake db:migrate
$ rails c

References