Prisma 中文文档 下载 App

datasource 配置详解:连接串、多环境、directUrl

url 字段

datasource 的 url 是最关键的配置——它告诉 Prisma 如何连接你的数据库:

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

推荐始终用 env() 从环境变量读取,不要把连接串硬编码在 Schema 里。

各数据库连接串格式

PostgreSQL

postgresql://user:password@host:port/dbname?schema=public

常见参数:

MySQL

mysql://user:password@host:port/dbname

SQLite

file:./dev.db        // 相对路径
file:/absolute/path  // 绝对路径

MongoDB

mongodb://user:password@host:port/dbname
mongodb+srv://user:password@cluster.mongodb.net/dbname  // Atlas

directUrl(生产环境重要)

directUrl 是 Prisma v4.7 引入的概念,用于在 Prisma Migrate 和 Prisma Client 之间指定不同的连接串:

datasource db {
  provider  = "postgresql"
  url       = env("DATABASE_URL")        // Prisma Client 用(可以走连接池)
  directUrl = env("DIRECT_URL")          // Prisma Migrate 用(绕过连接池直连)
}

为什么需要两个 URL

一些场景下,DATABASE_URL 会被指向一个连接池(比如 Prisma Accelerate 或 PgBouncer)。但 Prisma Migrate 无法通过连接池执行迁移——它需要一个直接到数据库的连接。所以你需要:

典型场景:Vercel + Neon + Accelerate。Neon 给了两个连接串,一个 pooled、一个 direct。

什么时候不需要 directUrl

开发环境、没有连接池的简单部署、SQLite(不需要这个参数)。只有当生产环境用了连接池或代理层时才需要。

多环境管理

开发、测试、生产通常连不同的数据库。推荐做法:

方案一:不同的 .env 文件

.env.development  → DATABASE_URL="postgresql://localhost/mydb_dev"
.env.staging      → DATABASE_URL="postgresql://staging-db/mydb"
.env.production   → DATABASE_URL="postgresql://prod-db/mydb"

配合 Prisma CLI 的 dotenv 加载:

# 用指定的 env 文件跑 migrate
DATABASE_URL="postgresql://staging-db/mydb" npx prisma migrate deploy

或者手动指定:

PRISMA_ENV=staging npx prisma migrate deploy

方案二:代码里动态替换

在初始化 PrismaClient 时指定 datasource URL 覆盖:

const prisma = new PrismaClient({
  datasourceUrl: process.env.DATABASE_URL,
})

环境变量优先级

Prisma CLI 从以下几个来源加载环境变量,优先级从高到低:

  1. 命令行显式指定(DATABASE_URL=... npx prisma ...)
  2. 当前 shell 环境变量
  3. .env 文件(Schema 文件所在目录起往上查找)