Node.js Prisma ORM:跨世代的型別安全資料庫存取工具

Prisma 是目前 Node.js 與 TypeScript 社群中最炙手可熱的 ORM 工具。它不只是傳統的物件關聯映射,更是一套完整的資料庫開發工具鏈,旨在大幅縮減開發者在資料庫操作上踩坑的機會與重複的體力活。

為什麼 Prisma 正在取代傳統 ORM?

  • 型別安全 (Type Safety):Prisma Client 會根據你的資料庫結構自動產出 TypeScript 定義。你在 IDE 中輸入 .findMany({ where: { ... } }) 時,會得到精確的欄位提示。
  • Schema 驅動:使用簡潔的 schema.prisma 定義模型,而不是寫繁瑣的 JavaScript 類別。
  • Prisma Studio:內建一個漂亮的 Web 介面(GUI),讓你不用打開 SQL 管理工具就能直接查看資料。

快速上手:三個核心步驟

1. 初始化與 Schema 定義

安裝 Prisma CLI 並初始化環境:

npm install prisma --save-dev
npx prisma init

在自動產生的 prisma/schema.prisma 中定義模型:

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  authorId  Int
  author    User    @relation(fields: [authorId], references: [id])
}

2. 同步資料庫 (Migrate)

執行以下指令,Prisma 會自動幫你在資料庫中建表,並產出對應的 Client 程式碼。

npx prisma migrate dev --name init_db

3. 使用 Prisma Client 進行 CRUD

const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

async function main() {
  // 建立連動資料 (Nested Write)
  const user = await prisma.user.create({
    data: {
      email: 'mike@node.tw',
      name: 'Mike',
      posts: {
        create: { title: '我的第一篇 Prisma 文章' },
      },
    },
  });

  // 查詢並聯動讀取 (Include)
  const allUsers = await prisma.user.findMany({
    include: { posts: true },
  });
  console.log(allUsers);
}

進階查詢技巧

Prisma 的語法非常直覺,且避免了 SQL 碎片化。

const results = await prisma.post.findMany({
  where: {
    // 模糊搜尋與關聯過濾
    title: { contains: 'Node' },
    author: { email: { endsWith: '@gmail.com' } },
  },
  orderBy: { id: 'desc' },
  take: 10, // 分頁:取 10 筆
  skip: 0, // 分頁:略過 0 筆
});

專業開發必備指令

  • npx prisma generate:手動更新 Client 型別(當你手動改過 Schema 時)。
  • npx prisma studio:開啟本地 Web GUI 管理介面。
  • npx prisma db pull:從現有資料庫倒推回 Schema(適合用於舊專案重構)。

總結

  1. Prisma 將資料庫開發從「寫字串」提升到了「定義結構」的高度。
  2. 即使是在純 JavaScript 專案中,Prisma Client 提供的 IDE 自動完成建議也能大幅提升開發速度。
  3. 它在 TypeScript 專案中更是無敵的存在,直接杜絕了因拼錯欄位名稱導致的運行期錯誤。