老柯修机铺

通讯行老师傅的手机软件笔记——每款 App 装过、用过,才敢写下来

Prisma 怎麼讓我的後端資料庫工作流少踩三個坑

以前手寫 SQL 查詢和維護 migration 簡直要人命,直到把 Prisma 嵌進 Node.js 開發鏈——從 Schema 定義到 Client 查詢再到 Studio 可視化,一套工具把資料層的雜活全包了

Prisma:把資料庫變成 TypeScript 物件的開發者工具

Prisma 是一款面向現代開發者的資料庫工具鏈,核心是一個 Node.js / TypeScript 的 ORM,但同時提供直觀的可視化操作介面。它讓你用 TypeScript 物件的方式來建模、查詢和遷移資料庫,不用再手寫大段 SQL。跟傳統 ORM 不同的是,Prisma 生成的 Client 是型別安全的——你的編輯器能自動補全所有查詢方法,連返回值的型別都推導好了,基本上寫錯一個欄位名在編譯階段就會被擋下來。

這款工具適合什麼人?如果你是一個用 Node.js 或 TypeScript 寫後端的開發者,每天跟 PostgreSQL、MySQL、SQLite 或 MongoDB 打交道,又討厭維護 migration 檔案和手寫 JOIN 查詢,Prisma官網 就是為你準備的。它把資料層最繁瑣的那部分工作——Schema 定義、型別安全查詢、遷移管理、可視化編輯——全部打包成一套工具,你只需要照著 Schema 寫查詢,其他交給它。

安裝

Prisma下載 的 Android 安裝包約 64.71MB(版本 4.6.3.626),安裝方式跟一般 Android App 類似:下載 APK 後允許「未知來源」安裝權限,點擊安裝包一路下一步即可。第一次啟動時需要建立資料庫連接,支援 PostgreSQL、MySQL、SQLite 和 MongoDB。如果你是開發者,還需要在專案裡安裝 Prisma CLI 和 Client:執行 npm install prisma @prisma/client,然後用 npx prisma init 初始化一個新的 Prisma 專案,初始化後會自動生成 schema.prisma 檔案——這是整個工具鏈的核心,所有資料模型都在這裡定義。最後跑 npx prisma generate 生成型別安全的 PrismaClient 實例,就能在程式碼裡調用了。

要注意的坑:Prisma CLI 版本和 @prisma/client 版本必須完全一致,版本不匹配會導致執行時直接報錯;另外,如果你專案裡已經有舊版 Prisma 或其他 ORM,建議先備份再升級,尤其是有現成 migration 檔案的情況。

Prisma 安裝完成後的 Studio 啟動畫面

舊流程的三個痛點

說實話,在遇到 Prisma 之前,我對後端資料層這件事一直是抱著「能跑就行」的心態。以前的工作流大概是這樣:

首先用原生 SQL 或 Sequelize 之類的工具建表,migration 檔案自己寫或靠工具生成,但生成的常常跟實際需求對不上,要手改。寫查詢的時候,複雜的多表 JOIN 查詢只能寫原生 SQL,Sequelize 的 include 方法在三層以上關聯時根本看不懂輸出結果。每次資料模型變更,還要自己寫 rollback 腳本——曾經有一次我忘記寫 rollback,在測試環境炸了半個小時才救回來,尷尬到想換專案。

第二個痛點是團隊協作。兩個人同時改資料模型,各自跑 migration,合併時就會發生衝突。Prisma 的 migration 是按目錄名字典序執行的,兩個人同天建了 20240115_add-user 和 20240115_add-post,合併後誰先誰後全看運氣——運氣不好就是其中一個 migration 依賴另一個還沒建好的表,直接報錯。

第三個痛點是除錯。資料有問題的時候,我只能進資料庫客戶端手動查詢,打開一堆 JOIN 視窗,看的頭都暈。之前用 Sequelize 的時候,debug 模式輸出的 SQL 跟我預期的經常不一樣,找問題要花很長時間——而且 Sequelize 的 debug 輸出不是預設開啟的,要自己在啟動參數裡加選項。

新流程:Prisma 嵌進來後的鏈路

現在我的工作流是這樣的:

Schema 先行。所有資料模型都在 schema.prisma 裡定義,用 Prisma 的 DSL 寫,比 SQL 直觀多了——欄位型別、關聯關係、唯一約束全在一個檔案裡,一目了然。定義完後跑 npx prisma migrate dev --name xxx,Prisma文檔 中介紹的 Prisma 會自動生成 migration 檔案並應用到資料庫——再也不用手寫 migration 了。而且 migration 檔案跟程式碼一起 commit,團隊成員 pull 下來後跑一次 migrate dev 就能同步最新結構。

查詢全靠 Prisma Client。生成的 Client 有型別安全,編輯器自動補全。複雜查詢用 $transaction 包起來,要嘛全部成功要嘛全部回滾——之前手寫 SQL 事務時漏寫了一個回滾分支導致資料不一致,現在這種問題不會再出現了。Prisma 支援兩種事務用法:簡單場景用批量事務(數組傳參,性能好,一次事務裡發送所有語句),複雜場景用互動事務(函數傳參,可以先讀再判斷再寫,但每個查詢都是單獨的 SQL 往返,性能稍差)。

可視化除錯靠 Studio。資料出問題時,我直接跑 npx prisma studio 啟動可視化介面,左側欄切換 model,主區域直接瀏覽和編輯資料。雙擊單元格就能改,Studio 會自動做基本校驗——型別錯誤顯示紅色提示、必填欄位清空會警告、唯一約束衝突會直接阻止保存。關係欄位可以展開查看關聯記錄,還支援快捷鍵操作——Ctrl+Shift+F 篩選、N 新增、Ctrl+Z 撤銷。之前要進資料庫客戶端打 SQL 查詢的事,現在點幾下就搞定了。

擴展靠 $extends。有時候需要給查詢加一些橫切關注點,比如自動加軟刪除、給慢查詢打 log、按 tenant 自動加過濾條件。Prisma Client Extensions 讓我在不修改 Schema 的情況下,用 $extends() 給 Client 加自定義行為。比如我加了一個軟刪除擴展,讓所有 delete() 自動變成 update({ deletedAt: now() }),同時所有查詢自動排除已刪除的記錄——以前要在每個查詢裡手寫 where: { deletedAt: null },現在一個擴展全搞定。擴展還可以鏈式疊加,公共擴展甚至能寫成可復用的函式。

Prisma Client Extensions 擴展架構示意

最容易斷鏈的兩個環節

說說實際用下來最容易出問題的地方——這兩個坑我踩過好多次:

一是 migration 衝突。團隊協作時最常見的坑——兩個人同時跑了 migrate dev,各自生成了不同的 migration,合併後 Prisma 報「資料庫狀態與歷史不一致」。解決辦法很簡單:先 git pull 拉最新代碼,然後跑 npx prisma migrate status 看狀態。這個指令會告訴你資料庫裡已應用了哪些 migration、本地 migrations/ 目錄裡有哪些、Schema 和最後一次 migration 快照是否一致。根據輸出選擇修復:如果只是資料庫沒跟上本地 migration,跑 migrate deploy 就行;如果有衝突的 migration 檔案,檢查一下目錄名字典序有沒有重疊,手動調整一下。實在不行(開發環境資料不重要的時候),migrate reset 清空重來也很快。關鍵是——選定一種遷移方式就堅持到底,不要 db push 和 migrate dev 混用,混用必定出事。

二是事務死鎖。高併發場景下,兩個事務互相等對方釋放鎖會導致死鎖,Prisma 會拋 P2034 錯誤提示「Transaction failed due to a write conflict or a deadlock. Please retry your transaction」。處理方式是加一個重試機制——用指數退避策略重試最多三次,大部分死鎖在第二次重試時就能通過。千萬不要在事務裡做非資料庫操作(調第三方 API、寫檔案)——事務佔用期間資料庫連接被鎖,做慢操作會導致超時。另外,互動事務的預設超時是 5000ms,如果你的事務裡有多個慢查詢,記得用 { maxWait: 5000, timeout: 10000 } 參數調大。

效果與邊界

用了 Prisma 之後,我的後端資料層開發時間大概減了 40% 左右——以前一天寫 migration 和查詢,現在半天搞定。團隊協作衝突從每週三四次降到每月一兩次。除錯時間縮短更明顯:以前 debug 一個資料問題平均要 15 分鐘,現在用 Studio 三分鐘就能定位。

但 Prisma 也不是萬能的,有幾件事你必須心裡有數:它不支援跨資料庫事務——一個 $transaction 只能操作同一個資料庫,如果你有多個資料庫的場景,還是要自己想辦法;互動事務的性能比批量事務差——函數裡每個查詢都是單獨的 SQL 往返,不是一次批量發送,所以能用批量事務就別用互動事務;生產環境絕對不要用 migrate dev——它有能力根據 Schema 變化自動生成並執行新 migration,生產環境應該用 migrate deploy,只執行已存在的 migration 檔案。

最後說句真心話:Prisma 最打動我的不是功能有多強,而是它真的把資料層的工作流理順了。以前那種「改了 Schema → 忘了跑 migration → 線上炸了」的問題,現在從根本上解決了——因為 Schema 是唯一真源,migration 自動生成,Studio 讓你隨時可視化檢查。如果你還在後端資料層掙扎,試試看。

本文为个人基于网络公开资料整理编写,非官方内容,仅供学习交流参考;软件版权归原作者所有,请支持正版;使用过程中遇到问题请查阅官方渠道,本文不承担任何责任。

同类文章

UniClaw 橫評:把 AI 嵌進聊天裡,是進步還是折騰

同類 AI 助手早已泛濫成災,UniClaw 偏要把操作台壓縮成聊天輸入框——派活、追问、交付全在對話裡完成。它憑什麼在擁擠的賽道裡切出一塊自己的地盤,又為哪些人踩了坑?這篇給你講透。