SuperAPI AI 工具集

prisma-cli-db-pull

编程与开发

查看项目

更新于 10-16 04:07

技能介绍

用途

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'),
  },
})

工作流

从已有数据库开始:

  1. 初始化 Prisma:prisma init
  2. 配置数据库 URL
  3. 拉取 schema:prisma db pull
  4. 审阅并自定义生成的 schema
  5. 生成客户端: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 预览
  • 备份想要保留的自定义内容