できない.dev

Prisma で「Can't reach database server」(P1001)が解決できない

P1001 Can't reach database server は、Prisma がデータベースに接続できないときに出る。
DB の起動状態とホスト・ポート・認証情報、接続 URL を確認すれば解消する。

公開: 更新:

実行例あり(2026-09-19 に実環境で検証)

要約

P1001: Can't reach database server at {host}:{port} は、Prisma が指定したホストとポートのデータベースに到達できないときに出る。

これは PrismaClientInitializationError として投げられ、接続が確立できないことを示す(公式: Error Reference(新しいタブで開く))。

DB の起動状態、接続 URL のホスト・ポート・認証情報を順に確認すれば切り分けられる。

実行例

サーバーを止めた状態では P1001 が出て終了コード 1 になり、pg_isready も no response を返す。
起動後もポート番号が 5433 のままだと同じ P1001 が続き、.env を 5432 に戻したところで db push が通った。

$ npx prisma db push --skip-generate
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "app", schema "public" at "localhost:5432"
 
Error: P1001: Can't reach database server at `localhost:5432`
 
Please make sure your database server is running at `localhost:5432`.
終了コード: 1
$ pg_isready -h localhost -p 5432
localhost:5432 - no response
$ pg_isready -h localhost -p 5432
localhost:5432 - accepting connections
$ cat .env
DATABASE_URL="postgresql://postgres:pass@localhost:5433/app?schema=public"
$ npx prisma db push --skip-generate
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "app", schema "public" at "localhost:5433"
 
Error: P1001: Can't reach database server at `localhost:5433`
 
Please make sure your database server is running at `localhost:5433`.
終了コード: 1
$ cat .env
DATABASE_URL="postgresql://postgres:pass@localhost:5432/app?schema=public"
$ npx prisma db push --skip-generate
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "app", schema "public" at "localhost:5432"
 
🚀  Your database is now in sync with your Prisma schema. Done in 73ms
 
終了コード: 0

— 2026-09-19 時点の出力

検証環境

検証日
実行環境
node:20Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. データベースサーバーが起動していない、またはポートが違う。
  2. DATABASE_URL のホスト名・ポート・認証情報が誤っている。
  3. Docker で localhost を指しているが、コンテナ間では service 名で解決する必要がある。
  4. ファイアウォールや SSL 要件で接続がブロックされている。

解決策

1. DB の起動とポートを確認する

# 例: PostgreSQL がポート 5432 で待ち受けているか
pg_isready -h localhost -p 5432

2. DATABASE_URL を見直す

DATABASE_URL="postgresql://user:pass@HOST:PORT/db?schema=public"

P1001 は host:port に到達できないことを示すので、まず接続先の値が正しいかを確認する。

3. Docker Compose では service 名で接続する

# localhost ではなく compose の service 名を使う
DATABASE_URL="postgresql://user:pass@db:5432/app"

別コンテナの DB へは localhost ではなく Compose のサービス名で名前解決する。

この記事は役立ちましたか?