第一次建模与第一次查询(最小闭环)
本教程共 54 篇 · 第 5 篇 · 更新于 2026-08-11 · 约 4 分钟阅读
本节目标:跑通「改 Schema → 迁移 → 生成客户端 → 查询」的完整闭环,建立 Prisma 工作的心智模型。
第一步:定义第一个模型
打开 prisma/schema.prisma,在 datasource 块下面写两个模型。模型(model)代表数据库里的一张表:
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
先不深究语法,只建立直觉:User 有 id、email、name;Post 属于某个 User。posts Post[] 是关系字段,表示一个用户可以有多篇文章——这是一对多关系。细节留到建模章节。
第二步:migrate dev 把 Schema 变成数据库
npx prisma migrate dev --name init
这条命令是开发环境的核心。它做了四件事:
- 对比 Schema 和数据库的差异
- 生成 SQL 迁移文件
migration.sql - 把迁移应用到数据库,真正建出表
- 在迁移历史里记录这次变更
生成的迁移文件长这样(PostgreSQL 为例):
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL NOT NULL,
"email" TEXT NOT NULL,
"name" TEXT,
PRIMARY KEY ("id")
);
目录结构:
prisma/migrations/
└── 20260811120000_init/
└── migration.sql
文件夹名是「时间戳 + 你给的 --name」。这份历史要提交到版本库,它是数据库的「版本管理记录」。
Warningv7 里
migrate dev不再自动执行generate,也不再自动跑种子脚本。这是和 v6 最大的行为差异,忘了会报「找不到 PrismaClient」。
第三步:generate 生成客户端
npx prisma generate
这条命令读取 Schema,在 output 指定的目录生成 Prisma Client 代码。模型变了,客户端代码就得重新生成,否则查询的类型和字段都是旧的。
Note一个常见新手坑:改了 Schema、跑了迁移,但忘了
generate,结果编辑器里找不到user、post这些属性。记住口诀——迁移管数据库,generate 管代码,两个都要跑。
第四步:实例化带适配器的 Prisma Client
新建 lib/prisma.ts:
import "dotenv/config";
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "../generated/prisma/client";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
export { prisma };
v7 强制要求传入驱动程序适配器(Driver Adapter)。PrismaPg 内部用 pg 驱动建连接池,Prisma Client 通过它发 SQL。
应用里应该只创建这一个实例,所有模块共用。后面章节会讲单例模式,现在先记住:别在每次请求时 new PrismaClient()。
第五步:第一次写入与读取
新建 script.ts:
import { prisma } from "./lib/prisma";
// 写入:创建一个用户,连同他的第一篇文章
const user = await prisma.user.create({
data: {
name: "Alice",
email: "alice@prisma.io",
posts: {
create: { title: "我的第一篇博客" },
},
},
include: { posts: true },
});
console.log("创建成功:", user);
// 读取:查出所有用户(含文章)
const allUsers = await prisma.user.findMany({
include: { posts: true },
});
console.log("所有用户:", JSON.stringify(allUsers, null, 2));
await prisma.$disconnect();
运行:
npx tsx script.ts
create 的 posts.create 是嵌套写入:一条语句同时创建用户和文章,底层包在一个事务里。include 把关联的文章一起查出来。这些是查询章节的主角,这里先感受一下。
闭环心智模型
从此以后,你的日常循环是这样的:
- 改 Schema:增删模型、字段
migrate dev --name 描述:数据库跟上 Schemagenerate:代码跟上 Schema- 写查询:用 Prisma Client 读写数据
Schema 是唯一的源头。数据库和代码都向它看齐,这就是 schema-first 的日常形态。
Tip循环中断是最常见的出错点。报「类型不存在」→ 多半忘了 generate;报「表不存在」→ 多半忘了 migrate。按循环顺序检查,两步就能定位。
参考来源
- Prisma 官方文档:Prisma Migrate 入门(Getting started)、Quickstart(PostgreSQL)
- 英文教程:dev.to(Satyam Gupta)- Mastering Prisma ORM
- 英文教程:dev.to(Burak Boduroglu)- Prisma Part 1:你的 Prisma 入门指南
- 英文教程:JS Mastery - Prisma Crash Course for Beginners