Prisma 實戰指南:像搭積木一樣設計古詩詞資料庫

### Prisma 實戰指南:像搭積木一樣設計古詩詞資料庫

在傳統後端開發中,與資料庫打交道往往意味著要撰寫大量晦澀的 SQL 語句。而 Prisma 就像一位精通多國語言的「翻譯官」,它透過 ORM(物件關聯對映)技術,將資料庫的資料表映射為程式碼中的類別,將資料列映射為實例。你不再需要手寫 INSERTSELECT,只需像操作一般物件一樣 createfindMany,Prisma 就會在幕後為你翻譯成精準的 SQL。

接下來,我們就結合一個「古詩詞社群」的實際專案,從零開始體驗 Prisma 的魅力。

一、環境建置與初始化

首先,我們需要為專案安裝 Prisma 的核心依賴。建議鎖定版本以避免相容性問題:
pnpm i [email protected]
pnpm i @prisma/[email protected]

依賴安裝完成後,執行 npx prisma init。這條命令會為你產生兩個關鍵檔案:.env(存放環境變數)和 prisma/schema.prisma(資料庫設計藍圖)。

打開 .env,填入你的 PostgreSQL 連線字串,例如:
DATABASE_URL="postgresql://postgres:369369@localhost:5432/xue?schema=public"

二、Schema 設計:繪製資料庫藍圖

schema.prisma 是整個 ORM 的靈魂。在這個檔案中,我們透過 model 來定義資料表。讓我們結合古詩詞專案的實際設計,看看幾個核心模型是如何建構的:

1. 基礎設定與使用者模型
檔案開頭定義了產生器和資料來源,告訴 Prisma 我們要產生 JS 用戶端並連接 PostgreSQL。

kotlin 体验AI代码助手 代码解读复制代码generator client {
  provider = "prisma-client-js"
}
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
model User {
  id        Int      @id @default(autoincrement())
  name      String   @unique @db.VarChar(255)
  password  String   @db.VarChar(255)
  // 使用 @map 將駝峰欄位映射為資料庫的底線命名
  createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
  updatedAt DateTime? @default(now()) @map("updated_at") @db.Timestamptz(6)
  // 一對多關係:一個使用者可以有多篇文章、評論、按讚等
  posts     Post[]
  comments  Comment[]
  likes     UserLikePost[] 
  files     File[]
  avatars   Avatar[]
  @@map("user") // 將資料表名稱映射為單數 user
}

2. 核心業務與級聯策略
Post(詩詞文章)模型中,我們看到了外鍵關聯與刪除策略的巧妙配合:

kotlin 体验AI代码助手 代码解读复制代码model Post {
  id       Int     @id @default(autoincrement())
  title    String  @db.VarChar(255)
  content  String? @db.Text
  userId   Int?             
  // 關聯 User,並設定 onDelete: SetNull
  // 意思是:如果作者被刪除,文章保留但作者 ID 置空
  user     User?   @relation(fields: [userId], references: [id], onDelete: SetNull) 
  comments Comment[]
  tags     PostTag[]
  @@index([userId]) // 為外鍵加上索引,提升查詢效率
  @@map("posts")
}

3. 複雜關聯:自我關聯與複合主鍵
古詩詞社群少不了評論互動與標籤分類,這裡用到了兩個進階技巧:

  • 自我關聯(評論回覆):在 Comment 模型中,透過 parentId@relation("CommmentToComment") 實現了評論的層級回覆(父評論與子評論)。
  • 複合主鍵(多對多中介表)PostTag(文章標籤)和 UserLikePost(使用者按讚)作為中介表,使用 @@id([postId, tagId]) 定義了複合主鍵。這確保了「一篇文章不能被重複加上同一個標籤」以及「一個使用者不能重複按讚同一篇文章」的業務邏輯。

三、遷移與視覺化:讓設計落地

設計好 Schema 後,我們需要將其同步到真實的資料庫中。

  1. 資料遷移:執行 npx prisma migrate dev --name init_user。Prisma 會自動比對目前資料庫結構,產生 SQL 遷移檔並執行,同時在資料庫中記錄版本日誌。這不僅方便團隊協作,也方便後續的版本回滾。
  2. 視覺化操作:執行 npx prisma studio。這會打開一個精美的圖形化介面,你可以在瀏覽器中直觀地查看 UserPost 等資料表的資料,甚至手動新增測試資料(Seeds),完全告別黑漆漆的命令列。

四、程式碼操作:告別 SQL

當一切準備就緒,你就可以在程式碼中透過 Prisma Client 優雅地操作資料了。例如,查詢李白發佈的所有詩詞:

php 体验AI代码助手 代码解读复制代码const libaiPosts = await prisma.post.findMany({
  where: { user: { name: 'libai' } },
  include: { tags: true } // 順帶查出文章標籤
});

從安裝設定到模型設計,再到最終的程式碼呼叫,Prisma 用型別安全和高度抽象的 API,將開發者從繁瑣的 SQL 中徹底解放了出來。


原文出處:https://juejin.cn/post/7634854379502714880


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝11   💬7  
247
🥈
我愛JS
💬1  
5
🥉
Gigi
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登