首页 / Prisma ORM 入门教程 / 第一次建模与第一次查询(最小闭环)

Prisma ORM 入门教程

第一次建模与第一次查询(最小闭环)

本教程共 54 篇 · 第 5 篇 · 更新于 2026-08-11 · 约 4 分钟阅读

Prisma模型迁移migrate devPrisma Client查询

本节目标:跑通「改 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
}

先不深究语法,只建立直觉:UseridemailnamePost 属于某个 Userposts Post[] 是关系字段,表示一个用户可以有多篇文章——这是一对多关系。细节留到建模章节。

第二步:migrate dev 把 Schema 变成数据库

npx prisma migrate dev --name init

这条命令是开发环境的核心。它做了四件事:

  1. 对比 Schema 和数据库的差异
  2. 生成 SQL 迁移文件 migration.sql
  3. 把迁移应用到数据库,真正建出表
  4. 在迁移历史里记录这次变更

生成的迁移文件长这样(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」。这份历史要提交到版本库,它是数据库的「版本管理记录」。

Warning

v7 里 migrate dev 不再自动执行 generate,也不再自动跑种子脚本。这是和 v6 最大的行为差异,忘了会报「找不到 PrismaClient」。

第三步:generate 生成客户端

npx prisma generate

这条命令读取 Schema,在 output 指定的目录生成 Prisma Client 代码。模型变了,客户端代码就得重新生成,否则查询的类型和字段都是旧的。

Note

一个常见新手坑:改了 Schema、跑了迁移,但忘了 generate,结果编辑器里找不到 userpost 这些属性。记住口诀——迁移管数据库,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

createposts.create 是嵌套写入:一条语句同时创建用户和文章,底层包在一个事务里。include 把关联的文章一起查出来。这些是查询章节的主角,这里先感受一下。

闭环心智模型

从此以后,你的日常循环是这样的:

  1. 改 Schema:增删模型、字段
  2. migrate dev --name 描述:数据库跟上 Schema
  3. generate:代码跟上 Schema
  4. 写查询:用 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