---
# System prepended metadata

title: Prisma ORM 入門介紹
tags: [學習, SQL, TypeScript, MongoDB, MySQL, MSSQL, Node]

---

![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 檔案）|
