メインコンテンツへスキップ
kt-tech.blog

【設定・環境構築】Bun + Prisma 7 環境構築ガイド(PrismaPg adapter / seed / migrate)

設定・環境構築5分で読めます

この記事でわかること

  • Prisma 7 で必須になったドライバアダプター(PrismaPg)の渡し方
  • seed 設定が package.json から prisma.config.ts に移ったこと(移し忘れると黙って何も起きない)
  • seed ファイルでアプリ本体の prisma インスタンスを使えない理由と回避策
  • Bun でのコマンド一覧と、最初に踏む 3 つのエラー

Bun 1.x 以上、Prisma 7.x(@prisma/adapter-pg が必須)、PostgreSQL 16(ローカルは Docker 推奨)。

メモ
Bun環境でPrisma 7(PrismaPg adapter必須)を使う際のセットアップ手順とハマりどころを紹介します。

はじめに

Prisma 7ではドライバアダプター(PrismaPg等)が必須になり、PrismaClientの初期化方法が変わりました。BunランタイムでのセットアップにはNode.js時代とは異なるハマりポイントがあります。

1. PrismaClientの初期化

Prisma 7ではPrismaClientにadapterを渡す必要があります。

TypeScript
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "@prisma/client";

const adapter = new PrismaPg({
  connectionString: process.env.DATABASE_URL!,
});

const prisma = new PrismaClient({ adapter });
export default prisma;
注意
Prisma 6 以前の new PrismaClient() だけではエラーになります(「PrismaClient needs non-empty PrismaClientOptions」)。必ず adapter を渡してください。

2. prisma.config.ts(Prisma 7の新設定)

TypeScript
import path from "node:path";
import { defineConfig } from "prisma/config";

export default defineConfig({
  earlyAccess: true,
  schema: path.join("prisma", "schema.prisma"),
  migrations: {
    path: "prisma/migrations",
    seed: "bun ./prisma/seed.ts",  // ← Bun用のseed設定
  },
});
注意
Prisma 7 では package.jsonprisma.seed無視されますprisma.config.tsmigrations.seed に設定してください。設定を移し忘れると、エラーではなく黙って何も起きないので気づきにくいです。

3. Seedファイル

seedファイルでもadapterが必要です。アプリ本体のprismaインスタンス(@/lib/prisma)はNext.jsのモジュール解決に依存するため、seed用に別途PrismaClientを作成します。

TypeScript
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "@prisma/client";
import "dotenv/config";  // .envを直接読み込む

const adapter = new PrismaPg({
  connectionString: process.env.DATABASE_URL!,
});
const prisma = new PrismaClient({ adapter });

async function main() {
  // upsertでべき等にシード
  await prisma.character.upsert({
    where: { slug: "char-a" },
    update: { name: "キャラA", ... },
    create: { slug: "char-a", name: "キャラA", ... },
  });
}

main()
  .catch((e) => { console.error(e); process.exit(1); })
  .finally(() => prisma.$disconnect());

4. コマンドまとめ

Bash
# マイグレーション作成・適用
bun prisma migrate dev --name add_feature

# シード実行
bun prisma db seed

# Prisma Studio(DB確認GUI)
bun prisma studio

# スキーマからクライアント再生成
bun prisma generate

トラブルシューティング

重要
PrismaClient needs non-empty PrismaClientOptions → adapter の渡し忘れ。PrismaPg adapter を import して渡す。
重要
prisma db seed が「seed command not found」→ package.json ではなく prisma.config.ts に seed 設定を書く(Prisma 7)
重要
Foreign key constraint violated → JWT のユーザー ID が DB に存在しない。DB を作り直したときに、古いセッションがブラウザに残っているのが原因。セッションをクリアして再ログイン。

まとめ

  • Prisma 7ではPrismaPg adapterが必須 — アプリ本体もseedも両方に設定
  • seed設定はprisma.config.tsのmigrations.seedに書く
  • seed ファイルでは dotenv/config で直接 .env を読む(Next.js のモジュール解決は使えない)

参考リンク

更新履歴

  1. seed のコード例に入っていたプロダクト固有の名前を汎用な形に差し替え。コードブロックにファイルパスのキャプションを追加し、callout の色指定を他記事と揃えた。seed 設定の移し忘れが黙って失敗すること、Foreign key エラーの発生状況を補足。参考リンクの節を新設し、Prisma 周りの関連記事へのリンクを追加。本文の前提条件をプロパティへ移動。