------ 把 schema.prisma
写得像诗,跑得像闪电 🌩️
"To model, or not to model ------ that is the compilation error."
------ 莎士比亚(如果他会写 Prisma)
0️⃣ 开场白:为什么要建模?
想象数据库是一块披萨 🍕,Schema 就是披萨饼底的配方。没有它,你只能得到一滩番茄酱和芝士的灾难现场。
在 Next.js 的项目里,Prisma 是那位戴着墨镜、骑着摩托、嘴里嚼着口香糖的"数据牛仔"。它帮我们把一堆 SQL 的狂野西部,驯服成一行行优雅的 JS 对象。
1️⃣ 安装 Prisma:给项目装上火箭推进器
bash
npm install prisma @prisma/client
npx prisma init
执行完之后,项目根目录会出现:
prisma/schema.prisma
(主角登场).env
(数据库连接字符串的秘密基地)
2️⃣ 连接数据库:把牛仔拴在正确的马桩上
在 .env
里,把数据库 URL 写成一行诗:
bash
DATABASE_URL="postgresql://username:password@localhost:5432/next_prisma?schema=public"
如果你用的是 MySQL、SQLite、MongoDB......把 postgresql
换成对应的关键词即可。
⚠️ 注意:别把密码写成
123456
,否则黑客会笑到把键盘吃掉。
3️⃣ 定义 Schema:写诗时间 📜
打开 prisma/schema.prisma
,我们先写一个最简单的模型 ------ User。
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())
updatedAt DateTime @updatedAt
}
🔍 拆解每一行:
行 | 解释 | 小图标 |
---|---|---|
id |
主键,自增 | 🔑 |
email |
唯一,像指纹 | 🖐️ |
name |
可选,因为有人叫"佚名" | 🤷 |
createdAt |
自动生成时间戳 | ⏳ |
updatedAt |
每次更新自动刷新 | 🔄 |
4️⃣ 关系:让模型谈恋爱 💕
单表太孤独,我们来建一对"一对多"关系 ------ User ↔ Post。
prisma
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
里加一行反向关系:
prisma
posts Post[]
这样,每个用户就能拥有"一堆"帖子,就像妈妈拥有"一堆"你的童年黑历史照片 📸。
5️⃣ 枚举:给字段加"表情包" 😶🌫️
比如,帖子的状态不想用布尔值,想用更友好的枚举:
prisma
enum Status {
DRAFT
PUBLISHED
ARCHIVED
}
model Post {
...
status Status @default(DRAFT)
}
现在,你可以写 status: 'PUBLISHED'
,而不是记不住 true
到底是发布还是草稿。
6️⃣ 索引:给数据库开"高速公路" 🛣️
当数据量大起来,查询会变慢,就像早高峰的地铁。加索引:
prisma
model Post {
...
@@index([authorId])
}
数据库会在 authorId
上建 B-Tree 索引,查询从"挤地铁"变成"坐磁悬浮"。
7️⃣ 迁移:把模型送进数据库的"产房" 👶
bash
npx prisma migrate dev --name init
Prisma 会生成 SQL 文件并执行,像把设计图交给施工队。
🎉 Tip:每次改完 schema 都要跑迁移,否则数据库会像旧爱一样,永远不懂你的新需求。
8️⃣ 生成客户端:让 JS 认识新表
bash
npx prisma generate
这一步会生成 @prisma/client
,里面包含类型安全的 JS API。
你可以这样用:
js
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
const newUser = await prisma.user.create({
data: {
email: 'neo@matrix.com',
name: 'The One'
}
})
9️⃣ 彩蛋:用 Emoji 做字段注释
Prisma 支持 ///
三斜杠注释,会被带到生成的类型里:
prisma
model User {
/// 🎂 生日,用来提醒你送礼物
birthday DateTime?
}
在 VS Code 里 hover 就能看到 emoji,快乐编码,从注释开始!
🔚 结语:你的模型,你的宇宙
schema.prisma
不只是配置文件,它是你数据宇宙的宪法。
写得好,项目像星际飞船;写不好,数据库就是黑洞。
愿你在 Next.js 的星辰大海里,用一行行优雅的 schema,构建出属于自己的银河帝国。
"Live long and Prisma prosper." 🖖