MacでPostgreSQLを使う

Djangoでアプリ開発をしていると、いつか一般公開したくなる時がきます。

そんな時ぶち当たるのがデータベースの壁!

PostgreSQLは無料で使えるデータベースなので、今のうちにローカルで使い慣れておきましょう!

Djangoのプロジェクトで、PostgreSQLを使うには予めPostgreSQL内にデータベースを作っておく必要があります。

INFO
まだDjangoやターミナルに慣れてない方は、SQLiteで慣れてから挑戦してみると良いかもしれません。

Homebrew

homebrewを使ってPostgreSQLをインストールするので入ってない場合は入れておきます。

$ $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

インストールできるPostgreSQL

$ brew search postgresql

==> Formulae
postgresql@10     postgresql@13     postgresql@9.5    postgrest
postgresql@11     postgresql@14 ✔   postgresql@9.6
postgresql@12     postgresql@9.4    qt-postgresql

==> Casks
navicat-for-postgresql

上記の場合、バージョン14がインストールされています。


インストールと確認

インストールされていなければインストールしましょう。

バージョンを指定しなければ最新のバージョンがインストールされます。

$ brew install postgresql
$ psql --version

psql (PostgreSQL) 14.5 (Homebrew)

起動と確認

$ brew services start postgresql

==> Successfully started `postgresql`
$ brew services list

Name          Status  User  File       
postgresql@14 started User ~/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist

Statusが「started」になっていれば起動できている。

エラーが起こったら
私の場合、古いバージョンのPostgreSQLでデータベースが作成されていてエラーが起こりました。これはデータベースに互換性が無いのが原因で、古いデータベースを新しいバージョンにアップグレードする必要がありました。
$ brew postgresql-upgrade-database

データベース一覧を表示

$ psql -l

                        List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 postgres  | User  | UTF8     | C       | C     | 
 template0 | User  | UTF8     | C       | C     | =c/User         +
           |       |          |         |       | User=CTc/User
 template1 | User  | UTF8     | C       | C     | User=CTc/User  +
           |       |          |         |       | =c/User

デフォルトでは、上記のようなデータベースのリストが表示されたはずです。


データベースに入る

$ psql postgres

postgres=# 

先頭が「データベース名#」になります。


ユーザー一覧

ローカル環境の場合、Macで設定している名前のロールがスーパーユーザーとして自動で設定されます。

本番環境では、postgresのロールがスーパーユーザーとして自動で作成されます。

バックスラッシュは「¥」 で入力できます。

postgres=# \du

Role name  |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 YOURNAME  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

パスワード設定

自動で作成されたYOURNAMEのロールにはパスワードが設定されないので設定しておく。

postgres=# \password

Enter new password for user "YOURNAME":

新しくデータベースを作成

データベースはプロジェクト毎に用意しなければならないので、データベース名はプロジェクト名などにすると分かりやすいかもしれません。「database_name」の部分をデータベース名にしてください。

postgres=# CREATE DATABASE database_name;
INFO
アプリを公開したい場合は、データベース名、ユーザー名、パスワードなどを本番環境と同じにする前提で設定すると良いかも。

新規ユーザー

Djangoから接続するため、新たなユーザーとパスワードを設定します。

ユーザー作成

「new_user」「password」を自身のものに書き換えて下さい。

本番環境も同じ名前にすると良いので覚えておいて下さい。

postgres=# CREATE USER new_user WITH PASSWORD 'password';

作成できたか確認

postgres=# \du

Role name  |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 YourName  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 new_user  |                                                            | {}

データベースから出る

postgres=# \q

Djangoで設定

settings.pyのDATABASEを変更します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        # データベースの名前(defaultは空)
        'NAME': 'database_name',
        # データベースに接続するユーザー(defaultは空)
        'USER': 'new_user',
        # データベースへの接続時に使用するパスワード
        'PASSWORD': 'password',
        # データベースへの接続時に使用するホスト。空の文字列はlocalhost
        'HOST': '',
        # データベースへの接続時に使用するポート。空の文字列はデフォルトのポート
        # 空でもOK
        'PORT': '',
    }
}

PostgreSQLの接続について

DjangoはPostgreSQL 11以降をサポートしています。psycopg2 2.8.4 以降が必要です

Django公式 – PostgreSQLに関する注意事項

HOSTについて

PostgreSQLを使用している場合、デフォルト(空のHOST)では、データベースへの接続は「UNIXドメインソケット」(pg_hba.conf)を介して行われます。UNIXドメインソケットが標準の場所にない場合は、postgresql.confのunix_socket_directoryfromと同じ値を使用します。TCP ソケット経由で接続する場合は、HOSTを「localhost」または「127.0.0.1」に設定します (pg_hba.conf)

Django公式ドキュメント

コマンドまとめ

Brewコマンド

起動$ brew services start postgresql
終了$ brew services stop postgresql
再起動$ brew services restart postgresql
DBMS一覧と状態$ brew services list

psqlコマンド

データベース一覧$ psql -l
データベースに入る$ psql データベース名

SQLコマンド

データベースを出るpostgres=# \q
データベース作成postgres=# create database データベース名;
データベース削除postgres=# drop database データベース名;
ユーザー一覧postgres=# \du