Prisma 是給 Node.js / TypeScript 用的 ORM。你用一份 schema.prisma 描述資料表,Prisma 負責三件事:
PrismaClient,查詢寫錯欄位會在編譯時被檔住它和 Django 的 Model、SQLAlchemy 的角色很像:先定義資料,再讓程式去讀寫。差別是 schema 獨立成一個檔案,不寫在 class 裡。
專案位置:prisma/schema.prisma。一份 schema 只有三種區塊。
| 區塊 | 做什麼 |
|---|---|
datasource |
連哪一種資料庫、連線字串從哪裡讀 |
generator |
要產生哪一種 Client(這裡是 prisma-client-js) |
model |
一張資料表。一個 model 對應一張表 |
datasource db { // 資料來源設定
provider = "mysql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
env("DATABASE_URL") 不會把密碼寫進 schema。連線字串放在 .env:
DATABASE_URL="mysql://USER:PASSWORD@localhost:3306/auth_lab"
provider = "prisma-client-js":告訴 Prisma 產生適用於 Node.js / TypeScript 的型別安全客戶端(@prisma/client)。當你執行 nprisma generate 時,Prisma 會根據這份 Schema 自動生成對應的查詢方法與 TypeScript 型別。
以 Google SSO 為例,在 Google SSO 的登入流程中,常見做法是需要用兩張表:users 存使用者,sessions 存刷新憑證。而一個使用者可以有多筆 session。
可以透過烏鴉腳(Crow's Foot)語法,精準表達一對多、零對多等關聯關係,繪製成以下圖表:
erDiagram
USER ||--o{ SESSION : contains
USER {
string id PK
string name
}
SESSION {
string id PK
string user_id FK
}