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
常见参数:
schema=public— 指定默认 schemasslmode=require— Serverless 平台通常要求 SSLconnection_limit=1— 连接池大小限制
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 无法通过连接池执行迁移——它需要一个直接到数据库的连接。所以你需要:
DATABASE_URL— 应用运行时用,通过连接池DIRECT_URL— 迁移时用,绕过连接池直连数据库
典型场景: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 从以下几个来源加载环境变量,优先级从高到低:
- 命令行显式指定(
DATABASE_URL=... npx prisma ...) - 当前 shell 环境变量
.env文件(Schema 文件所在目录起往上查找)