db pull 内省:接入已有数据库到 Prisma
什么是内省(introspection)
内省就是让 Prisma 读取一个已有数据库的表结构、列类型、外键、索引等信息,自动生成一份对应的 schema.prisma。这是把 Prisma 接到现有项目上的关键入口。
npx prisma db pull
一条命令就能把你的 PostgreSQL / MySQL / SQLite / MongoDB 数据库翻译成 Prisma Schema。
使用场景
- 项目已有数据库,想引入 Prisma 作为 ORM 层——用
db pull让 Prisma 认识你的现有表结构 - 数据库由其他工具维护(比如以前用 TypeORM、Sequelize、或纯 SQL 脚本),想迁移到 Prisma
- 学习 Prisma,拿现有数据库当练手素材
- 团队成员的本地数据库版本不一致,互相 pull 代码后用
db pull对齐
完整步骤
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 能推断出关系。但以下情况可能推断不出:
- 外键约束没在数据库层面声明(只在代码里约束)
- 多对多中间表有额外字段(Prisma 会把它当成普通 model)
- 自引用关系(比如 Employee 的 managerId 指向 Employee.id)
内省完成后,打开 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 做版本化迁移,需要:
- 创建初始迁移——让 Prisma 把当前数据库结构当成"基线"
- 执行
npx prisma migrate dev --name init-schema - Prisma 会提示数据库结构与 Schema 已一致,生成一个空迁移或直接建立基线快照
MongoDB 的特殊情况
MongoDB 不内省"表结构"(MongoDB 没有表)。Prisma 会扫描 collection 里的文档样本,推断常用字段和类型。如果 collection 里文档结构差异很大,推断结果可能不准确,需要手动补全 Schema。