kt-tech.blog

画像

【設定・環境構築】Neon → Prisma Postgres 移行とローカル開発環境の構築

Share
💡
Neon から Prisma Postgres への DB 移行と、ローカル PostgreSQL との両立設定を解説します。accelerateUrl コンストラクタオプション、.env の使い分け、$extends の罠など実践的なポイントをまとめました。

はじめに

Cloudflare Workers では TCP ソケットが使えません。Neon のサーバーレス PostgreSQL は TCP 接続が前提のため、Workers 環境では直接接続できません。

HTTP 経由で DB に接続できる Prisma Postgres(旧 Prisma Accelerate)に移行することで、この問題を解決しました。

この記事でわかること

  • Neon から Prisma Postgres への移行理由と手順

  • accelerateUrl コンストラクタオプションの使い方

  • $extends(withAccelerate()) が不要な理由

  • ローカル PostgreSQL と Prisma Postgres を .env で切り替える方法

対象読者

  • Neon から Prisma Postgres に移行を検討している方

  • Workers 環境で DB 接続を構築したい方

前提条件

  • Prisma v7+

  • Prisma Postgres アカウント(prisma.io

  • ローカルに PostgreSQL が稼働中

1. なぜ Neon から移行するのか

Neon Prisma Postgres
接続方式 TCP HTTP
Workers対応 ×
コネクションプール Neon独自 Prismaビルトイン

Cloudflare Workers では TCP が使えないため、HTTP 経由の Prisma Postgres が最適です。

2. Prisma Postgres のセットアップ

Prisma Console でプロジェクトを作成すると、以下の 2 つの URL が発行されます。

# 接続用(HTTP 経由)
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=..."

# マイグレーション用(TCP 直接)
DIRECT_URL="postgres://[email protected]:5432/postgres?sslmode=require"

prisma/schema.prismadirectUrl を追加します。

datasource db {
  provider  = "postgresql"
  url       = env("DATABASE_URL")
  directUrl = env("DIRECT_URL")
}

3. accelerateUrl コンストラクタオプション

Prisma v7 では accelerateUrl をコンストラクタに渡すだけで Prisma Postgres 接続が有効になります。

// Workers 環境
const prisma = new PrismaClient({
  accelerateUrl: process.env.DATABASE_URL,
});
💡
公式ドキュメントにある $extends(withAccelerate())不要 です。accelerateUrl コンストラクタオプションだけで動作します。$extends を使うと TypeScript の include リレーション型が壊れる罠があるので注意。

4. .env でローカル/リモートを切り替え

# ローカル開発用
DATABASE_URL="postgresql://postgres:postgres@localhost:5434/anoni"
DIRECT_URL="postgresql://postgres:postgres@localhost:5434/anoni"

# 本番/ステージング用(コメントアウト)
# DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=..."
# DIRECT_URL="postgres://[email protected]:5432/postgres?sslmode=require"

ローカルではコメントを切り替えるだけで、リモート DB にも接続できます。

5. $transaction の制限

Prisma Postgres の HTTP 接続プール経由では、interactive transaction が不安定になることがあります。

// OK: 単純なトランザクション
await prisma.$transaction([
  prisma.user.update({ ... }),
  prisma.account.create({ ... }),
]);

// 注意: interactive transaction は不安定
await prisma.$transaction(async (tx) => {
  // HTTP 接続プール経由ではタイムアウトのリスクがある
});

Tips

1️⃣
マイグレーションは DIRECT_URL(TCP)経由で実行されます。prisma migrate devprisma db push はローカルでもリモートでも同じコマンドで OK。
2️⃣
ローカル DB リセット後は pgvector 拡張の再作成を忘れずに。CREATE EXTENSION IF NOT EXISTS vector; をスキーマ反映前に実行しましょう。

まとめ

  • Workers の TCP 制約から Neon → Prisma Postgres(HTTP)に移行

  • accelerateUrl コンストラクタオプションでシンプルに接続($extends 不要)

  • .env のコメント切り替えでローカル/リモートを簡単に切り替え

  • interactive transaction は HTTP 経由で不安定なので過度な依存は避ける