🐥

【Prisma 7】The datasource property url is no longer supported エラーの直し方

に公開

はじめに

Prisma 7 では、従来の schema.prisma に直接接続 URL を記述する方式が廃止されました。
これにより、Prisma 7 へ移行したプロジェクトでは P1012: The datasource property url is no longer supported エラーが発生します。この変更は Prisma の設計方針転換によるもので、モデル定義と環境依存設定を切り離す構成が採用されました。

本記事では、本エラーの対処方法と背景を解説します。

対象者

  • Prisma 6 から Prisma 7 に移行するエンジニア
  • Next.js などで Prisma を利用している方
  • Prisma の新しい設定体系(prisma.config.ts)を知りたい方

実際のエラーログ(P1012)

Prisma 6 時代の記述のままだと、Prisma 7 では以下のようなエラーが出ました。
これは「schema.prisma の中に url を書くのはもう禁止です」というエラーです。

$ npx prisma migrate dev

Error: P1012

Error: Prisma schema validation - (get-config wasm)
Error code: P1012
error: The datasource property `url` is no longer supported in schema files. Move connection URLs for Migrate to `prisma.config.ts` and pass either `adapter` for a direct database connection or `accelerateUrl` for Accelerate to the `PrismaClient` constructor. See https://pris.ly/d/config-datasource and https://pris.ly/d/prisma7-client-config  
 -->  prisma/schema.prisma:7
  |   provider = "postgresql" 
  |   url      = env("DATABASE_URL")
  | 

Validation Error Count: 1

結論

P1012 の直し方の手順を先に知りたい方はこちらからご確認ください。

以下の2ステップで修正します。

  1. schema.prismadatasource ブロックから url 行を削除する

    datasource db {
        provider = "postgresql"
        // url = env("DATABASE_URL")  ← 消す
    }
    
  2. プロジェクトルートに prisma.config.ts を作成し、接続情報を定義する

    // prisma.config.ts
    import { defineConfig } from '@prisma/config';
    
    export default defineConfig({
    datasource: {
        // ここで環境変数を読み込む
        url: process.env.DATABASE_URL, 
    },
    // 必要に応じてジェネレーター設定などもここに移動可能
    generator: {
        name: 'client',
        provider: 'prisma-client-js',
    },
    });
    
  3. DATABASE_URL(およびテスト・ステージング等に必要な URL)を環境変数として設定する

  4. npx prisma migrate dev / npx prisma generate を再実行して動作確認

以上の流れで The datasource property "url" is no longer supported(P1012)は解消できます。

なぜ schema.prisma に url が書けなくなったのか

Prisma 7 からは、接続情報の設定の責務を schema.prisma から外す、という設計方針になりました。

これまでの問題点

以前の schema.prisma は、以下の2つの役割が混在していました。

  1. データモデリング: テーブル定義やリレーション(静的な情報)
  2. ランタイム設定: データベースURLやプロバイダー設定(環境に依存する動的な情報)

Prisma 7 の設計方針

Prisma 7 からは、schema.prisma は純粋なデータ構造の定義のみに集中するという方針になりました。

  • schema.prisma: テーブル定義だけを書く(言語に依存しない共通定義)。
  • prisma.config.ts: 接続先 URL やクライアント生成の設定を書く(TypeScript で記述可能)。

例:環境ごとに URL を切り替える場合

以下のようにすることで、TypeScript である優位性を活用できます。
設定の分岐ロジックを TypeScript 側に書きつつ、schema.prisma はきれいなままに保てます。

// prisma.config.ts
type Env = 'local' | 'staging' | 'production'

const env = (process.env.APP_ENV as Env) ?? 'local'

const urlByEnv: Record<Env, string> = {
  local: process.env.DATABASE_URL_LOCAL!,
  staging: process.env.DATABASE_URL_STG!,
  production: process.env.DATABASE_URL_PROD!,
}

export default defineConfig({
  schema: 'prisma/schema.prisma',
  datasources: {
    db: {
      url: urlByEnv[env],
    },
  },
})

おわりに

Prisma 7 へ移行した途端、これまで問題なく動いていた環境で突然エラーが出ることがあり、私自身とても戸惑いました。schema.prisma に書いていた URL が急に受け付けられなくなるなど、思わぬ変化に驚いた開発者も多いはずです。同じように困っている方にとって、少しでも状況を整理する手助けになれば幸いです。


株式会社ONE WEDGE

【Serverlessで世の中をもっと楽しく】
ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp/

GitHubで編集を提案

Discussion