用途
prisma db pull 用于对现有数据库进行内省,读取数据库结构并更新 Prisma schema,使其反映数据库当前的表、列、关系与索引。适用于从已有数据库开始使用 Prisma,或在 Prisma 之外对数据库做了改动后同步 schema。
主要能力
- 连接数据库并读取其 schema(表、列、关系、索引)
- 更新 schema.prisma,生成对应的 Prisma 模型
- 对 MongoDB 通过采样数据来推断 schema
使用方式
命令格式:
prisma db pull [options]
选项:
--force:忽略当前 Prisma schema 文件--print:将内省得到的 Prisma schema 打印到 stdout--schema:自定义 Prisma schema 路径--config:自定义 Prisma 配置文件路径--url:覆盖 Prisma 配置文件中的数据源 URL--composite-type-depth:指定复合类型内省的深度(默认 -1 表示无限,0 表示关闭)--schemas:指定要内省的数据库 schema--local-d1:从本地 Cloudflare D1 数据库生成 Prisma schema
示例:
基本内省:
prisma db pull
预览但不写入:
prisma db pull --print
强制覆盖:
prisma db pull --force
前置条件
需在 prisma.config.ts 中配置数据库连接:
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DATABASE_URL'),
},
})
工作流
从已有数据库开始:
- 初始化 Prisma:
prisma init - 配置数据库 URL
- 拉取 schema:
prisma db pull - 审阅并自定义生成的 schema
- 生成客户端:
prisma generate
同步来自数据库的更改(当数据库在 Prisma 之外被修改时):
prisma db pull
prisma generate
生成结果示例
数据库表会转换为 Prisma 模型。例如数据库表:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name VARCHAR(100)
);
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
author_id INTEGER REFERENCES users(id)
);
会变为:
model users {
id Int @id @default(autoincrement())
email String @unique @db.VarChar(255)
name String? @db.VarChar(100)
posts posts[]
}
model posts {
id Int @id @default(autoincrement())
title String @db.VarChar(255)
author_id Int?
users users? @relation(fields: [author_id], references: [id])
}
内省后的清理建议
执行 db pull 后可考虑:
重命名模型为 PascalCase:
model User { // Was: users
@@map("users")
}
重命名字段为 camelCase:
authorId Int? @map("author_id")
为清晰起见添加关系名称:
author User? @relation("PostAuthor", fields: [authorId], references: [id])
添加文档注释:
/// User account information
model User {
/// Primary email for authentication
email String @unique
}
MongoDB 内省
对于 MongoDB,db pull 会采样文档来推断 schema:
prisma db pull
由于 MongoDB 是无 schema 的,可能仍需手动细化。
限制与警告
db pull 会覆盖 schema 文件。建议始终:
- 拉取前提交当前 schema
- 先使用 --print 预览
- 备份想要保留的自定义内容