Prisma 中文文档 下载 App

db pull 内省:接入已有数据库到 Prisma

什么是内省(introspection)

内省就是让 Prisma 读取一个已有数据库的表结构、列类型、外键、索引等信息,自动生成一份对应的 schema.prisma。这是把 Prisma 接到现有项目上的关键入口。

npx prisma db pull

一条命令就能把你的 PostgreSQL / MySQL / SQLite / MongoDB 数据库翻译成 Prisma Schema。

使用场景

完整步骤

1. 准备 Prisma 项目

mkdir my-prisma-project
cd my-prisma-project
npm init -y
npm install prisma --save-dev
npm install @prisma/client
npx prisma init --datasource-provider postgresql

2. 配置连接串

在 .env 里填好 DATABASE_URL,指向你的现有数据库。

3. 执行 db pull

npx prisma db pull

执行完,prisma/schema.prisma 里会出现从数据库读出来的 model 定义:

model User {
  id       Int      @id @default(autoincrement())
  email    String   @unique
  name     String?
  posts    Post[]   @relation("UserPosts")
  createdAt DateTime @default(now()) @map("created_at")

  @@map("users")
}

注意 Prisma 会自动加上 @map("table_name") 来处理命名差异(数据库表名可能是复数 snake_case,Prisma model 默认 PascalCase)。

4. generate Prisma Client

npx prisma generate

5. 开始查询

const prisma = new PrismaClient()
const users = await prisma.user.findMany()

内省不会做什么

理解 Prisma 内省的边界很重要:

数据库里的东西内省能读到吗说明
表和列✅
数据类型✅尽量精确映射,比如 VARCHAR(255) → String @db.VarChar(255)
主键、外键、唯一约束✅
索引✅但 Prisma 只会把它当 @@index 标记,不生成 Prisma 级的关系推断
存储过程、触发器❌Prisma Client 不暴露这些,需要用 $queryRaw
视图❌Prisma 7 起逐步支持视图,但不是一等公民
注释部分PostgreSQL 注释可能会被读取进 /// 文档注释

关系可能推断不准

数据库里有外键约束时,Prisma 能推断出关系。但以下情况可能推断不出:

内省完成后,打开 schema.prisma 手动检查关系定义是个好习惯。

内省 vs db push vs migrate dev

三个命令对应三种不同的方向:

db pull   → 数据库 → Schema(内省/逆向)
db push   → Schema → 数据库(直接同步,无版本)
migrate dev → Schema → 数据库(版本化迁移)

典型接入已有数据库的流程:

db pull → 手动微调 Schema → generate → 开始在代码里用 Prisma Client

要不要转成正式迁移?

db pull 只是把数据库结构翻译成 Schema,没有迁移历史。如果以后你想在这个项目里用 migrate dev 做版本化迁移,需要:

  1. 创建初始迁移——让 Prisma 把当前数据库结构当成"基线"
  2. 执行 npx prisma migrate dev --name init-schema
  3. Prisma 会提示数据库结构与 Schema 已一致,生成一个空迁移或直接建立基线快照

MongoDB 的特殊情况

MongoDB 不内省"表结构"(MongoDB 没有表)。Prisma 会扫描 collection 里的文档样本,推断常用字段和类型。如果 collection 里文档结构差异很大,推断结果可能不准确,需要手动补全 Schema。