エラーを理解する
データベースに接続しようとした際、PostgreSQLから「FATAL: role "myuser" does not exist」というストレスの溜まるメッセージが返されることがあります。これはソフトウェアのバグではなく、単純な検索の失敗です。ログインを試みると、PostgreSQLは内部の pg_roles テーブルを確認します。指定した文字列と完全に一致するレコードが見つからない場合、接続を拒否します。
なぜこのエラーが発生するのか?
- ロールが存在しない: この特定のデータベースクラスターに、まだユーザーを実際に作成していません。
- 大文字小文字の罠:
"MyUser"(引用符付き)を作成したが、引用符がない場合、PostgreSQLはデフォルトでmyuser(小文字)を探します。 - 接続文字列のエラー:
.envファイルや接続文字列にタイポがあるか、ユーザーが存在しない間違ったポート(例:5432ではなく5433)を指している可能性があります。 - デフォルトユーザーの想定: 多くの Linux システムでは、PostgreSQLはOSのユーザー名と一致するデータベースロールを想定します。Linuxユーザーが「ubuntu」で、PostgreSQL内に「ubuntu」ロールを作成していない場合、エラーになります。
解決方法
1. 現在のロールを確認する
まず、誰に実際にアクセス権があるかを確認します。ユーザーリストを見るには、postgres スーパーユーザーとしてログインする必要があります。
# Postgres プロンプトにアクセス
sudo -u postgres psql
# 「ユーザー表示」コマンドを実行
\du
出力を注意深く確認してください。目的のユーザー名がリストにない場合は、作成する必要があります。
2. 不足しているロールを作成する
SQLインターフェースを使用して素早く修正できます。psql プロンプト内で、ログイン権限を持つ基本的なユーザーを作成するために次のコマンドを実行します:
CREATE ROLE myuser WITH LOGIN PASSWORD 'your_secure_password';
このユーザーが自身のデータベースを作成する必要がある場合(開発用ロールでは一般的)、CREATEDB 属性を追加します:
ALTER ROLE myuser WITH CREATEDB;
3. 大文字小文字の区別を処理する
PostgreSQLは大文字小文字の区別に厳格です。AppUser のような大文字小文字が混在するユーザー名を使用する必要がある場合は、作成時と接続時にダブルクォーテーションで囲む必要があります。しかし、すべてのデータベースオブジェクトを小文字に統一したほうが管理ははるかに楽になります。誤って引用符付きのロールを作成してしまった場合は、将来のトラブルを避けるために小文字にリネームできます:
ALTER ROLE "MyUser" RENAME TO myuser;
4. データベースへのアクセス権を付与する
ロールが存在していても、特定のデータベースへのアクセスが禁止されている場合があります。新しいユーザーにデータベース(例:project_db)の全所有権を付与するには、以下を実行します:
ALTER DATABASE project_db OWNER TO myuser;
接続をテストする
スーパーユーザーのプロンプトを終了し、新しいユーザーとして接続を試みます。-h localhost フラグを使用してTCP接続を強制すると、通常、設定したパスワードの入力を求められます。
psql -U myuser -d project_db -h localhost -W
project_db=> プロンプトが表示されれば、接続成功です。
スムーズなセットアップのためのヒント
「Peer」認証の罠を避ける
Linux では、ロールを修正しても Peer authentication failed エラーが発生することがあります。これは、PostgreSQLが Linux のログインユーザーとデータベースのログインユーザーを一致させようとするためです。ローカル開発でこれを回避するには、pg_hba.conf ファイル(通常は /etc/postgresql/15/main/ にあります)を見つけ、認証方式を peer から scram-sha-256 または md5 に変更します。
強力な資格情報を使用する
ローカル開発であっても、データベースのロールに「password」や「123456」を使用しないでください。これは本番環境での漏洩につながる悪い習慣です。私は通常、セキュリティを確保するために24文字の文字列を生成します。手軽に生成する方法が必要な場合は、ToolCraftの Password Generator がお勧めです。ブラウザ内でローカルにエントロピーを生成するため、キーがサーバーに送信されることはありません。

