2024年8月27日

宣佈 TypedSQL:使用 Prisma ORM 讓您的原生 SQL 查詢型別安全

隨著今天 v5.19.0 版本的釋出,Prisma ORM 引入了一種新的方式來以型別安全的方式編寫原生 SQL 查詢!現在,使用 Prisma ORM,您可以兼得兩全其美:對於大多數查詢而言,它提供了便捷的高階抽象,同時也是原生 SQL 的靈活、型別安全的逃生通道。

Announcing TypedSQL: Make your raw SQL queries type-safe with Prisma ORM

TL;DR: 我們讓原生 SQL 完全型別安全

我們相信,透過 Prisma ORM,我們設計出了最佳 API,可以編寫佔大多數應用 95% 的常規 CRUD 查詢!

對於剩下的 5% —— 那些無法透過 Prisma Client API 表達或需要極致效能的複雜查詢 —— 我們提供了一個較低級別的 API 來編寫原生 SQL。然而,這個逃生通道不提供型別安全,開發者也因此錯失了 Prisma ORM 帶來的出色開發體驗(DX),所以我們一直在尋找更好的方法!

隨著今天 Prisma ORM v5.19.0 版本的釋出,我們激動地宣佈 TypedSQL:編寫複雜和高效能查詢的最佳方式。TypedSQL 只是 SQL,但更勝一籌。它是完全型別安全的,提供自動補全,並在您需要編寫原生 SQL 查詢時提供出色的開發體驗。它的工作方式如下:

  1. .sql 檔案中編寫 SQL 查詢,並將其放入 prisma/sql 目錄中

    您也可以建立帶引數的 SQL 查詢!

  2. 使用 prisma generate 命令的 --sql 標誌生成查詢函式

  3. @prisma/client/sql 匯入查詢函式…

    … 並在新的 $queryRawTyped 函式中呼叫它,以獲得完全型別化的結果 😎

    如果您的 SQL 查詢帶有引數,它們將作為引數傳遞給 $queryRawTyped 的查詢函式

Prisma Client API 與 TypedSQL 結合,為 CRUD 操作和高度複雜的查詢提供了最佳體驗。透過這一新增功能,我們希望您將不再需要接觸 SQL 查詢構建器!

實現高效率的高階抽象

原生 SQL 仍然是關係型資料庫中查詢資料最強大、最靈活的方式。但它也存在一些缺點。

原生 SQL 的缺點

如果您以前在 TypeScript 專案中編寫過原生 SQL,您可能知道它並不能提供最佳的開發體驗(DX)

  • 編寫 SQL 查詢時沒有自動補全。
  • 查詢結果沒有型別安全。
  • 編寫和除錯複雜 SQL 查詢的複雜性。
  • 開發團隊的 SQL 經驗水平通常各不相同,並非團隊中的每個人都精通 SQL 編寫。
  • SQL 使用的資料模型(關係)與 TypeScript(物件)不同,需要進行相互對映;這在模型之間的關係方面尤為普遍,這些關係在 SQL 中透過外部索引鍵表示,但在 TypeScript 中則表示為巢狀物件

應用程式開發者應該關注資料——而非 SQL

在 Prisma,我們堅信應用程式開發者應該關注資料——而非 SQL。

大多數應用程式開發者編寫的查詢只使用了相當有限的功能集,通常與常見的 CRUD 操作相關,例如*分頁*、*篩選*或*巢狀查詢*。

我們的主要目標是確保應用程式開發者能夠快速獲取所需資料,而無需過多考慮查詢以及資料庫行到程式碼中物件的對映。

使用 Prisma ORM 快速交付

這就是我們構建 Prisma ORM 的原因,旨在為開發者提供一種抽象,提高他們的生產力並幫助他們快速交付!以下是使用 Prisma ORM 的典型工作流程概述。

首先,您在可讀的 schema 中定義資料模型

然後,使用 Prisma CLI 生成(可自定義的)SQL 遷移,並針對您的資料庫執行該遷移。一旦 schema 對映到您的資料庫,您就可以使用 Prisma Client 查詢它

逃生通道:回退到原生 SQL

雖然我們相信這種高階抽象能提高開發者的生產力,但我們也看到許多專案需要編寫原生 SQL 的選項。這通常發生在以下情況:

  • Prisma Client API 不夠靈活,無法表達某個特定查詢。
  • 查詢需要針對速度進行最佳化。

在這些情況下,Prisma ORM 透過使用 Prisma Client 的 $queryRaw 方法提供了原生 SQL 的逃生通道

這種方法的主要問題是查詢不是型別安全的。如果開發者想要享受到標準 Prisma Client API 帶來的型別安全優勢,他們需要手動編寫此查詢的返回型別,這可能既繁瑣又耗時。另一個問題是,這些手動定義的型別不會隨 schema 更改而自動更新,這引入了另一種出錯的可能性。

雖然有多種方法可以改進使用 Prisma ORM 原生查詢的開發體驗,例如使用 Kysely 查詢構建器擴充套件用於 Prisma ClientSafeQL,但我們希望以原生方式解決這個問題。

Prisma ORM 新增功能:TypedSQL 🎉

因此,我們很高興推出 TypedSQL,這是 Prisma ORM 中一個新的工作流程,為原生 SQL 查詢提供型別安全。TypedSQL 的靈感來源於 PgTyped 和 sqlx 等基於類似理念的專案。

有了 TypedSQL,Prisma ORM 現在讓您兩全其美:

  • 一種更高階的抽象,可提高開發者的生產力,並能滿足專案中大多數查詢的需求。
  • 當您需要直接編寫 SQL 時,一個令人愉悅且型別安全的逃生通道。

它還為擁有不同偏好的開發團隊提供了選擇自己喜歡方法的選項:您的團隊中是否有狂熱的 SQL 愛好者,但也有人對 SQL 避之不及?

現在,Prisma ORM 可以在不犧牲開發體驗或靈活性的前提下,滿足兩類團隊的需求!

立即試用並分享您的反饋

每當您過去不得不使用 $queryRaw 時,TypedSQL 現在是您的新夥伴。

我們將 TypedSQL 視為 SQL 查詢構建器的演進,因為它消除了所有抽象,讓開發者在資料庫查詢方面擁有更大的靈活性。


試用 TypedSQL

我們非常希望您能試用 TypedSQL,並在 XDiscord 上告訴我們您的想法!

不要錯過下一篇文章!

訂閱 Prisma 時事通訊

© . This site is unofficial and not affiliated with Prisma Data, Inc.