![0_E6TRT7I9JnJPZEQ9](https://hackmd.io/_uploads/Byrc-CMFZx.png) # 1. Prisma 是什麼? Prisma 是一套現代化的資料庫工具套件,專為 Node.js 與 TypeScript 應用程式設計。它扮演著程式碼與資料庫之間的橋樑。 與其撰寫原始 SQL: ```sql! SELECT * FROM users WHERE email = 'test@example.com'; ``` 你可以改用乾淨、可讀性高的 JavaScript / TypeScript: ```javascript! const user = await prisma.user.findUnique({ where: { email: 'test@example.com' } }); ``` Prisma 會自動將你的程式碼轉換成對應的 SQL 語句。 它支援 MySQL、PostgreSQL、SQLite、MongoDB 等多種資料庫系統。 # 2. 為什麼選擇 Prisma,而不是其他 ORM? | 功能 | Prisma | 傳統 ORM | | ----------- | -------------------- | ------------------- | | 型別安全 | 自動產生型別 | 手動撰寫型別定義 | | Schema 管理 | 單一清晰檔案 | 分散在多個 model 中 | | 自動補全 | 完整 IDE 支援 | 支援有限 | | Migration | 依據 schema 自動產生 | 手動撰寫 | | 學習曲線 | 容易上手 | 通常較複雜 | ⸻ 主要優勢: * 自動補全(Auto-completion):IDE 會自動提示資料表名稱、欄位與方法 * 型別安全(Type safety):在執行程式前就能捕捉錯誤 * 單一 Schema 檔案(Single schema file):所有模型集中定義於同一個地方 * 可讀性高(Human-readable):Schema 結構清楚、容易理解 # 3. Prisma 的三大核心工具 ## 3-1 Prisma Client — 在程式碼中操作資料庫 ```typescript! // Create(建立) await prisma.user.create({ data: { name: 'John', email: 'john@email.com' } }); // Read(讀取)or Query(查詢) await prisma.user.findMany(); // Update(更新) await prisma.user.update({ where: { id: 1 }, data: { name: 'Jane' } }); // Delete(刪除) await prisma.user.delete({ where: { id: 1 } }); ``` Prisma Client 讓你用直覺、型別安全的方式進行 CRUD 操作(建立、讀取、更新、刪除),而不需要手寫 SQL。 ## 3-2 Prisma Migrate — 管理資料庫 Schema 變更 ```bash! npx prisma migrate dev --name add_users_table ``` * 建立資料表 * 新增欄位 * 處理所有 schema 變更 全部由 Prisma 根據你的 schema 自動產生與管理。 ## 3-3 Prisma Studio — 視覺化資料庫瀏覽工具 ```bash! npx prisma studio ``` 執行後會在 localhost:5555 開啟圖形化介面(GUI),讓你瀏覽與編輯資料。 不需要再使用 phpMyAdmin 等傳統工具。 # 4. Prisma 工作流程總覽 ## Step 1:定義 Schema ```prisma! model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] } ``` 在 schema.prisma 中定義資料模型與欄位結構。 ## Step 2:執行 Migration ```bash! npx prisma migrate dev --name init ``` 根據你定義的 schema 建立或更新資料庫結構。 ## Step 3:產生 Client ```bash! npx prisma generate ``` 產生型別安全的 Prisma Client,讓你能在程式中操作資料庫。 ## Step 4:在程式中使用 ```typescript! import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() const users = await prisma.user.findMany({ include: { posts: true } }); const post = await prisma.post.findMany({ where: { author: { email: "test@example.com" } } }); ``` 透過 Prisma Client 進行資料查詢與操作。 # 快速指令參考(Quick Command Reference) | 工具 | 指令 | 用途 | | ---- | ---- | ---- | | Migrate |`npx prisma migrate dev`| 建立 / 更新資料表 | | Generate |`npx prisma generate`|產生資料庫查詢用的 Client| |Studio|`npx prisma studio`|視覺化資料瀏覽工具| |Push|`npx prisma db push`|快速同步資料庫(不產生 migration 檔案)|