macでPostgreSQLをインストールする

October 21, 2014
postgres postgreSQL mac rails

sqliteでは外部キー制約が使えるようになったが、gemのforeignerでは使えないらしい。なのでdevelopmentの確認用にpostgreSQLを使うことにした。

macでhomebrewを用いてpostgreSQLをインストールする。

クライアント専用として使う場合

自動起動はいらないのでインストールだけでOK。

$ brew install postgresql

サーバとして使う場合

インストールする

$ brew install postgresql

homebrewで作られた起動設定ファイルにシンボリックリンクを貼る

$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents

ログイン時に自動起動させる。このコマンドを打った時点で起動する。

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

ちなみにログイン時に自動起動させなくする場合は以下のコマンド。このコマンドを打った時点で終了する。

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

去年位までは$ initdb /usr/local/var/postgres -E utf8ってコマンドで初期文字コードを指定していたが、2014年10月21日現在、初期値がja_JP.utf-8になっていたのでいらないっぽい。

設定ファイルを弄る

shellに設定を書き込む。

zshの場合

$ touch ~/.zprofile
$ echo 'export ARCHFLAGS="-arch x86_64"' >> ~/.zprofile
$ echo 'export PGDATA="/usr/local/var/postgres"' >> ~/.zprofile
$ source ~/.zprofile

bashの場合

$ touch ~/.bash_profile
$ echo 'export ARCHFLAGS="-arch x86_64"' >> ~/.bash_profile
$ echo 'export PGDATA="/usr/local/var/postgres"' >> ~/.bash_profile
$ source ~/.bash_profile

ARCHFLAGSはgemで使う場合のみ追加。

PGDATA$ postgres -D /usr/local/var/postgresで起動させるがそれを$ postgresだけに省略できる。ただ自動起動の設定を使うとこのコマンドを使うことはない気がする。launchctl load -wlaunchctl unload -wで起動、終了できるし。

ちなみに.zprofile, .bash_profileはログイン時に1度しか読み込まれない。このままではシェル(terminal)を閉じると反映されない。なので一度ログアウトして反映させる。

外部公開とかはしないので、新規にユーザーを作成したりはしない。

Passwordの設定

まずpostgresにログインする

$ psql postgres

パスワードを設定する

postgres=# \password
postgres=# \q

このままではログイン時にパスワードを聞かれないので設定を変更する。

変更前

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

trustをmd5にする。

変更後

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

設定を反映させるためにpostgresを再起動する

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

パスワードを聞かれないようにする

パスワードを設定したが、ログイン時に一々聞かれると面倒。 なのでパスワードを設定ファイルに書いておく。

$ touch ~/.pgpass

中にはホスト名:ポート番号:データベース名:ユーザー名:パスワードのように書く。ワイルドカード*でもOK。

localhost:5432:*:pyarbz:hogepass

ちなみにこれは、外部にPostgresqlがある場合でも使える。アクセスするものが複数あれば、複数行書く。

TimezoneをUTCに変更する

RailsではDBにUTCとして保存し、取り出して使うときにその地域に合わせて変更した方がいいらしい。

また、Heroku PostgreSQLやAmazon RDSなど海外サーバを用いることが多いので、UTCに変更しておく。

変更前

log_timezone = 'Japan'
timezone = 'Japan'
lc_messages = 'ja_JP.UTF-8'
lc_monetary = 'ja_JP.UTF-8'
lc_numeric = 'ja_JP.UTF-8'
lc_time = 'ja_JP.UTF-8'

変更後

log_timezone = 'UTC'
timezone = 'UTC'
lc_messages = 'ja_JP.UTF-8'
lc_monetary = 'ja_JP.UTF-8'
lc_numeric = 'ja_JP.UTF-8'
lc_time = 'en_US.UTF-8'

PostgreSQLコマンド集

データベース

種類 postgres内のコマンド shellのコマンド
一覧 \l psql -l
作成 CREATE DATABASE データベース名; createdb データベース名 -U 使うユーザー名
選択 \c データベース名 psql データベース名
削除 DROP DATABASE データベース名; dropdb データベース名

テーブル

種類 postgres内のコマンド shellのコマンド
一覧 \d -
作成 CREATE TABLE テーブル名(id int, name varchar(255).....); -
削除 DROP TABLE products; -

ユーザー

種類 postgres内のコマンド shellのコマンド
一覧 \du -
作成 createuser -P ユーザー名;
作成(スーパー) createuser -s -P ユーザー名;
削除 dropuser ユーザー名
パスワード設定時のアクセス \password psql -U postgres template1
パスワード変更 ALTER USER postgres encrypted password 'パスワード'; -

その他

種類 postgres内のコマンド shellのコマンド
終了 \q またはctrl+d -
help \? -