Chapter 01

认识 Prisma 与初始化

理解 ORM 的价值,搞清 Prisma 三件套的分工,与 Drizzle/TypeORM 对比后完成 prisma init 与首次数据库连接。

1.1 ORM 是什么

ORM(Object-Relational Mapping,对象关系映射)是一类库,帮你在"面向对象的代码"与"关系型数据库的表"之间搭桥——免手写 SQL、免手拼字符串、免担心 SQL 注入,并让 IDE 能对查询做类型检查。

ORM(对象关系映射)
把数据库的行、列映射为编程语言里的对象与属性。Prisma 属于新一代 ORM,强调类型安全与开发体验。
schema-first(模式优先)
先在一份声明式文件里定义数据模型,再由工具据此生成代码/迁移。Prisma 用 schema.prisma 走这条路线,与 code-first(先写代码类再生成表)相对。
Prisma Client
prisma generate 生成的类型安全查询客户端,暴露 prisma.user.findMany() 式 API,入参出参全类型推断。
Prisma Migrate
声明式迁移工具。你改 schema,它 diff 出 SQL 并生成迁移文件,开发用 migrate dev,生产用 migrate deploy
Prisma Studio
内置的浏览器可视化 GUI,浏览/编辑/筛选表数据、沿关系跳转,本地开发调试极方便。
查询引擎(Query Engine)
Prisma Client 底层的执行组件,负责把类型安全调用翻译为 SQL。历史上是 Rust 二进制,新版提供纯 JS/WASM 引擎(driverAdapters)以适配 Edge/Serverless。

1.2 Prisma 三件套

Prisma 不是单个库,而是围绕 schema.prisma 的一组工具协同工作:

心智模型

schema.prisma单一事实来源(single source of truth)。改它 → generate 更新 Client 类型 → migrate 同步数据库结构。三步始终围绕这一份文件。

1.3 Prisma vs Drizzle vs TypeORM

维度PrismaDrizzleTypeORM
Schema 语法专用 DSL(schema.prisma)TypeScriptDecorator 类
代码生成✅ 需要 generate❌ 不需要
运行时体积较重(含引擎)7KB~10MB
Edge 支持driverAdapters/Accelerate✅ 原生
迁移工具Prisma Migrate(强)drizzle-kittypeorm migration
可视化 GUI✅ Studio(成熟)Drizzle Studio
SQL 表达力中(难的用 $queryRaw)高(接近原生)
MongoDB✅ 支持
学习曲线低(DSL 直观)低(懂 SQL 即可)
如何选

• 团队协作、追求开发体验与成熟迁移/GUI → Prisma
• 追求轻量、贴近 SQL、上 Edge → Drizzle
• 老项目已用 decorator 风格 → TypeORM

1.4 支持的数据库

数据库provider 值说明
PostgreSQLpostgresql功能最全,首选
MySQL / MariaDBmysql通用
SQLitesqlite本地/原型/测试
MongoDBmongodb文档数据库,语法略有差异
SQL Serversqlserver企业环境
CockroachDBcockroachdb分布式 Postgres 兼容

1.5 安装与初始化

# 安装 CLI(开发依赖)与 Client(运行时)
$ npm i -D prisma
$ npm i @prisma/client

# 初始化:默认 postgresql,也可指定其他 provider
$ npx prisma init --datasource-provider postgresql

prisma init 会生成两个文件:prisma/schema.prisma(模型定义)与 .env(含 DATABASE_URL)。

1.6 schema.prisma 骨架

// prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        Int     @id @default(autoincrement())
  email     String  @unique
  name      String?
  createdAt DateTime @default(now())
}
# .env
DATABASE_URL="postgresql://user:pass@localhost:5432/mydb?schema=public"

1.7 生成 Client 与建表

# 根据 schema 生成类型安全 Client 到 node_modules/.prisma/client
$ npx prisma generate

# 首次迁移:创建表并生成迁移文件
$ npx prisma migrate dev --name init
别忘了 generate

每次改完 schema.prisma 都要重新 prisma generatemigrate dev 会自动触发一次),否则 Client 类型与 schema 不同步,IDE 报错或类型过期。

1.8 第一次查询:Hello Prisma

// src/db.ts —— 单例 PrismaClient(详见第 9 章)
import { PrismaClient } from "@prisma/client";
export const prisma = new PrismaClient();
// src/app.ts
import { prisma } from "./db";

async function main() {
  await prisma.user.create({
    data: { email: "alice@example.com", name: "Alice" },
  });

  const users = await prisma.user.findMany();
  console.log(users);
  // [{ id: 1, email: "alice@example.com", name: "Alice", createdAt: ... }]
}

main().finally(() => prisma.$disconnect());
注意类型推断

users 的类型自动为 User[]——完全来自生成的 Client。若 create 时漏传必填的 email,TypeScript 会在编译期报错。

1.9 切换到 MySQL / SQLite

// MySQL:只需改 provider 与 url
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")  // mysql://user:pass@host:3306/db
}

// SQLite:本地文件即可,无需装数据库
datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

1.10 小结与下一步