自分だけのクイズ作成 - Quipha公開中

【Laravel】SailでPostgreSQLとpgAdminを使う

Laravel
スポンサーリンク

はじめに

今回は、Laravel SailでPostgreSQLを使う方法をまとめました。
標準ではMySQLが採用されていますが、変更することができます。

デプロイする環境に合わせて、DBを選択しましょう。

また、PostgreSQLを管理するためのツールである、pgAdminもインストールします。
それでは始めましょう。

使用するバージョンなど
  • Windows 11 or macOS Monterey (M1)
  • Laravel 8 or 9
  • PostgreSQL
  • pgAdmin

2022/10/16 WindowsとMacを使い、最新バージョンで確認しました。

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

【紹介】個人開発

私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。

また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます

是非多くの方に読んでいただき、Laravelの開発に少しでもお役に立てたら幸いです。

開発環境の準備

今回は、Laravel Sailを使って環境の構築を行いました。
以下の記事を参考にしてください。

Windows
Mac

VS Codeの用意

VS Codeのインストール方法は、以下の記事にまとめましたのでご覧ください。

設定方法は以下を参考にしてください。

新規プロジェクト作成

Laravel Sailを新規でプロジェクトを作成する場合、以下のコマンドを実行します。
デフォルトでは、mysql、redis、meilisearch、mailhog、seleniumが設定されます。

curl -s https://laravel.build/example-app | bash

プロジェクト作成時に、サービスを選択することができます。
今回は、PostgreSQLを指定してプロジェクトを作成します。

curl -s "https://laravel.build/example-app?with=pgsql" | bash

利用可能なサービスが色々あり、mysql、pgsql、mariadb、redis、memcached、meilisearch、minio、selenium、mailhogなどが選択できます。

複数指定する場合は、カンマ区切りで指定します。

詳しくは公式サイトをご覧ください。

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small...

docker-compose.ymlを確認しましょう。
PostgreSQLが追加されています。

...
    pgsql:
        image: 'postgres:14'
        ports:
            - '${FORWARD_DB_PORT:-5432}:5432'
        environment:
            PGPASSWORD: '${DB_PASSWORD:-secret}'
            POSTGRES_DB: '${DB_DATABASE}'
            POSTGRES_USER: '${DB_USERNAME}'
            POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}'
        volumes:
            - 'sail-pgsql:/var/lib/postgresql/data'
            - './vendor/laravel/sail/database/pgsql/create-testing-database.sql:/docker-entrypoint-initdb.d/10-create-testing-database.sql'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
            retries: 3
            timeout: 5s
...
volumes:
    sail-pgsql:
        driver: local

サービスを指定してプロジェクトを作成した場合は、既に使えるようになっています。
.envファイルを確認しましょう。
DB_HOSTにpgsql が指定されています。

DB_CONNECTION=pgsql
DB_HOST=pgsql
DB_PORT=5432
DB_DATABASE=example_app
DB_USERNAME=sail
DB_PASSWORD=password

以下のコマンドでテーブルを作成し、使用することができます。

sail artisan migrate
スポンサーリンク

既存プロジェクトに追加

既にSailでプロジェクトを作成しており、MySQLを指定している場合でも変更できます。

sail php artisan sail:install

コンテナ環境に何を構築するか聞かれます。
今回はPostgreSQLだけインストールしたいので、1を入力しEnterで進めました。

Which services would you like to install? [mysql]:
  [0] mysql
  [1] pgsql
  [2] mariadb
  [3] redis
  [4] memcached
  [5] meilisearch
  [6] minio
  [7] mailhog
  [8] selenium

もし複数指定する場合は、カンマ区切りで入力します。
ちなみにSailでプロジェクトを作成した場合は、デフォルトで以下の番号のサービスが追加されています。

0,3,5,7,8

もちろん後からサービスの追加はできます。

以下のメッセージが表示され、環境の構築はすぐに終わります。
docker-compose.ymlが先ほどと同様になります。

Sail scaffolding installed successfully.

設定ファイルの.evnを確認します。
DB_CONNECTIONはpgsqlで、ポートも5432になっていました。

DB_CONNECTION=pgsql
DB_HOST=mariadb
DB_PORT=5432
DB_DATABASE=example_app
DB_USERNAME=sail
DB_PASSWORD=password

ホストの指定をPostgreSQLに変更します。

DB_CONNECTION=pgsql
DB_HOST=pgsql
DB_PORT=5432
DB_DATABASE=example_app
DB_USERNAME=sail
DB_PASSWORD=password

Sailを再起動しましょう。
サービスの変更を行うと、Sailの停止時にエラーになる場合があります。
その場合は、一度Dockerからコンテナを停止しました。

sail down
sail up -d

これでDBを使用することができます。

pgAdminの導入

pgAdminから見れるようにしましょう。

まずは、pgAdminにログインするためのメールアドレスとパスワードを、.envに指定します。

PGADMIN_EMAIL=xxxxxxxxxx@gmail.com
PGADMIN_PASSWORD=password

ログイン情報は任意で指定してください。
また、.evnはgitの管理対象外ですので、重要な情報はdocker-compose.ymlへ記載せず、.evnへ記載すると良いでしょう。

docker-compose.ymlを修正します。
pgAdminに関する情報を、servicesブロック内に追記します。

    pgadmin4:
        image: dpage/pgadmin4
        ports:
            - 8888:80
        volumes:
            - pgadmin4_data:/var/lib/pgadmin
        environment:
            PGADMIN_DEFAULT_EMAIL: '${PGADMIN_EMAIL}'
            PGADMIN_DEFAULT_PASSWORD: '${PGADMIN_PASSWORD}'
        networks:
            - sail
...
volumes:
...
    pgadmin4_data:
        driver: local

後述していますが、PGADMIN_DEFAULT_EMAILにはメールアドレス形式の値を指定しないとエラーになり起動できません。

データは永続化しています。

pgAdminコンテナも作成しましたので、ブラウザから以下のURLにアクセスします。

http://localhost:8888/

pgAdminの画面が表示されました。
メールアドレス、パスワードは、docker-compose.ymlの「pgadmin4」に記載の通りです。

PostgreSQLのデータベースへのログイン情報ではありませんので注意してください。
本記事の通りであれば、「xxxxxxxxxx@gmail.com/password」になります。

管理画面が表示されました。

作成したPostgreSQLのデータベースを操作できるようにしましょう。
「Add New Server」をクリックします。

Nameは任意で指定します。

接続情報を入力します。
ホスト名はコンテナを指定しますので、「pgsql」を指定します。

DB名(DB_DATABASE)やユーザ(DB_USERNAME)、パスワード(DB_PASSWORD)は、.envの記載の情報にします。

データベースのダッシュボードが表示されました。

「Properties」を確認するとPostgreSQL 14.5が稼働しているのが確認できます。

Laravelで作成したテーブルを確認します。
データが正しく挿入されています。

pgAdminの使い方については、ここでは掘り下げませんが、テーブルに対する操作ができます。

トラブルシューティング

pgadmin4コンテナが起動しない

docker-compose.ymlで、PGADMIN_DEFAULT_EMAILにメールアドレス形式ではない文字を指定するとコンテナ起動時にエラーになります。

    environment:
        PGADMIN_DEFAULT_EMAIL: root
        PGADMIN_DEFAULT_PASSWORD: password

これは古いバージョンのpgAdminでは問題ありませんが、最新のバージョンではエラーになります。

コンテナ起動時のエラーログは以下のようになります。
この場合、コンテナは起動していませんので、URLにアクセスしてもpgAdminの画面が表示されません

‘root’ does not appear to be a valid email address. Please reset the PGADMIN_DEFAULT_EMAIL environment variable and try again.

この状態で一度コンテナ・ボリュームを作成してしまった場合は、それらを削除して作り直す必要があります。

pgAdmin操作時にエラーが発生する

pgAdminがサポートしていないバージョンのPostgreSQLを操作しようとするとエラーが発生します。
例えば、pgAdminが古く、PostgreSQLが新しい場合です。

Error retrieving the information – INTERNAL SERVER ERROR

ERROR: column rel.relhasoids does not exist
LINE 8: pg_get_userbyid(rel.relowner) AS relowner, rel.relhasoids,…

pgAdminのドキュメントを確認します。

Container Deployment — pgAdmin 4 6.5 documentation
pgAdmin - PostgreSQL Tools for Windows, Mac, Linux and the Web

例えばpgAdmin 5.7の場合は、PostgreSQL 14をサポートしていません。
この組み合わせの場合は、エラーが発生します。

どちらも最新のバージョンを使用すると問題ないと思います。

その他

初学者へ

Laravelを初めて触る方へ向け、手順やアドバイスをまとめました。

外部サーバーへ公開

作成したアプリは公開して使ってもらいましょう!
Laravelアプリケーションを外部公開する方法をまとめました。

脆弱性対策

脆弱性を抱えたアプリケーションの場合、攻撃を受ける可能性があり大変危険です。
作成したアプリケーションは、脆弱性対策も意識しましょう。

GitHubと連携

GitHubと連携する方法を解説しました。
プロジェクトの管理はGitHubを活用しましょう。

さいごに

今回は、Laravel SailでPostgreSQLを使う方法をまとめました。

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

\オススメ/

コメント

タイトルとURLをコピーしました