本日公開のv5.19.0リリースで、Prisma ORMは生のSQLクエリをタイプセーフに記述する新しい方法を導入しました! Prisma ORMで最高の両立が実現します。 大多数のクエリに対する便利な高レベル抽象化 *と* 生のSQLに対する柔軟でタイプセーフなエスケープハッチです。

TL;DR: 生のSQLを完全にタイプセーフにしました
Prisma ORMでは、ほとんどのアプリの95%を占める通常のCRUDクエリを記述するための最良のAPIを設計したと信じています!
残りの5% — Prisma Client APIでは表現できない、または最高のパフォーマンスを必要とする複雑なクエリ — については、生のSQLを記述するための低レベルAPIを提供してきました。しかし、このエスケープハッチはタイプセーフを提供せず、開発者はPrisma ORMで慣れ親しんだ優れたDXを欠いていたため、より良い方法を探していました!
本日のPrisma ORM v5.19.0リリースで、TypedSQLを発表できることを嬉しく思います。複雑で高性能なクエリを記述するための最良の方法です。TypedSQLは単なるSQLですが、より優れています。 完全にタイプセーフで、自動補完を提供し、生のSQLクエリを作成する必要があるときはいつでも素晴らしいDXを提供します。仕組みは次のとおりです。
-
.sqlファイルにSQLクエリを記述し、
prisma/sql
ディレクトリに配置します。引数付きのSQLクエリも作成できます!
-
prisma generate
で--sql
フラグを使用してクエリ関数を生成します。 -
@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を使用する典型的なワークフローの概要を以下に示します。
まず、人間が読めるスキーマでデータモデルを定義します。
Prisma CLIを使用して、(カスタマイズ可能な)SQLマイグレーションを生成し、データベースに対してマイグレーションを実行できます。 スキーマがデータベースにマッピングされると、Prisma Clientでクエリを実行できます。
エスケープハッチ:生のSQLへの切り替え
この種の高レベル抽象化が開発者の生産性を高めると信じていますが、多くのプロジェクトが生のSQLを記述するオプションを必要としていることがわかりました。 これは通常、次の場合に発生します。
- Prisma Client APIが特定のクエリを表現するのに十分な柔軟性がない場合。
- クエリを速度のために最適化する必要がある場合。
これらのケースでは、Prisma ORMはPrisma Clientの $queryRaw
メソッドを使用することにより、生のSQLのエスケープハッチを提供します。
このアプローチの主な問題は、このクエリがタイプセーフではないことです。 開発者が標準のPrisma Client APIから得られるタイプセーフの利点を享受したい場合、このクエリの戻り型を手動で記述する必要があります。これは面倒で時間がかかります。 もう1つの問題は、これらの手動で定義された型がスキーマの変更で自動更新されないため、エラーの可能性がもう1つ導入されることです。
Prisma ORMの生クエリを使用してDXを改善する方法(例:Prisma Client用のKyselyクエリビルダー拡張機能またはSafeQLを使用するなど)がありますが、この問題をネイティブな方法で解決したいと考えました。
Prisma ORMの新機能:TypedSQL 🎉
そのため、生のSQLクエリにタイプセーフを提供するPrisma ORMの新しいワークフローであるTypedSQLを発表できることを嬉しく思います。 TypedSQLは、同様のアイデアに基づいたPgTypedやsqlxなどのプロジェクトに触発されています。
TypedSQLにより、Prisma ORMは最高の両立を提供します。
- 開発者の生産性を高め、プロジェクト内の大部分のクエリに対応できる高レベル抽象化。
- SQLを直接作成する必要がある場合に、快適でタイプセーフなエスケープハッチ。
また、個々の開発者の好みが異なる開発チームに、好みの方法を選択するオプションを提供します。チームに熱狂的なSQLファンであるエンジニアと、SQLには絶対触れたくない人もいますか?
Prisma ORMは、DXや柔軟性を犠牲にすることなく、両方のグループが望むものを両方とも提供します!
試してフィードバックを共有してください
TypedSQLは、これまで $queryRaw
を使用していた場合にいつでも役立つ新しい仲間です。
私たちはTypedSQLをSQLクエリビルダーの進化と捉えており、すべての抽象化を取り除くことで、開発者にデータベースクエリにおいてさらに柔軟性を提供します。
TypedSQLを試す
ぜひTypedSQLを試して、XとDiscordで感想をお聞かせください!
次の投稿をお見逃しなく!
Prismaニュースレターに登録する