概要
本日、Prisma 2の最初のプレビュー版をリリースします。これは、データベースワークフローを簡素化し、近代化する2つの主要なツールで構成されています。
PhotonとLiftは、アプリケーションで単独でも併用でも使用できます。Prisma 2は数ヶ月間プレビュー版として提供されます。ぜひお試しいただき、フィードバックをお寄せください!
目次
- 2019年のデータベースワークフローは時代遅れ
- Prisma 2: 次世代のデータベースツール
- Prisma 2のはじめ方
- Prismaが既存のDBツール/ORMと異なる理由
- Prisma 2の新機能
- Prisma 2の安定化と将来の破壊的変更の回避
- 特定の機能が必要ですか?フィードバックをお寄せください!
- Prisma Dayでお会いしましょう
2019年のデータベースワークフローは時代遅れ
近年、アプリケーション開発の多くの分野は、デジタル化時代がもたらす新しい要件に適合するように近代化されてきました。
- フロントエンドのWebアプリケーションは、通常、静的なHTMLとjQueryを使用する代わりに、DOMの宣言的な抽象化(React、Vueなど)によって駆動されています。
- バックエンド開発者は、Node.js、Go、Elixirなどのモダンな言語とランタイムを活用し、ユースケースに合った適切なトレードオフを実現しています。
- コンピュートは以前はプライベートデータセンターでプロビジョニングされていましたが、今日ではほとんどのワークロードがパブリッククラウド上のコンテナやサーバーレスで実行できます。
- ストレージソリューションは、セルフホスト型からRDSやAzure Storageのようなマネージドサービスへと移行しています。
しかし、開発者が日々扱っているデータベースワークフローについてはどうでしょうか?アプリケーション内からデータベースにアクセスしたり、スキーママイグレーションを実行したりするための次世代ツールとは何でしょうか?
データベースアクセスには、開発者は従来のORM(例:Node.js用のSequelizeやGo用のGORM)を使用できます。これらはプロジェクトを開始する上ではしばしば有益ですが、プロジェクトの複雑さが増すにつれて従来のORMの能力をすぐに超えてしまうため、長期的な選択肢としては適していません。
スキーママイグレーションのためのツールとベストプラクティスはさらに細分化されており、組織はデータベーススキーマをマイグレーションするために独自のツールやプロセスを開発する傾向があります。
Prisma 2: 次世代のデータベースツール
過去3年間、大企業や個人の開発者がデータアクセスに関する課題を解決するのを支援してきた結果、現代の開発スタックで開発者がデータベースを扱うのに役立つツールセットをリリースできることを誇りに思います。
Prisma 2は、データアクセスとマイグレーションの問題に取り組むための2つのスタンドアロンツールを含んでいます。
PhotonとLiftをさらに詳しく見ていきましょう。
Photon – 従来のORMに代わる型安全なデータベースクライアント
Photonは、Prismaデータモデル(データベーススキーマの表現)に基づいて自動生成される型安全なデータベースクライアントです。これは、アプリケーションでデータベースとやり取りするために使用できる、強力で軽量なマッピングコード層を提供します。
アプリケーション開発者のニーズに合わせて調整された、モダンで人間工学に基づいたデータアクセスAPIを備えています。Photon APIはPhotonサイトで確認できます。
Lift – 宣言的なデータモデリングとマイグレーション
Liftは、データベーススキーマをコード化するPrismaの宣言的なデータモデル定義に基づいています。データベースをマイグレーションするには、データモデルを調整し、Lift CLIを使用して変更を「適用」します。
すべてのマイグレーションは明示的な一連のステップで表現されるため、プロジェクトのライフタイムを通じてマイグレーション履歴を保持し、マイグレーション間を簡単に行き来できます。マイグレーションは、before/afterフックで拡張することもできます。
より良い組み合わせ: PhotonとLiftのワークフローのシームレスな統合
PhotonとLiftは、新規プロジェクトでも既存プロジェクトでも、アプリケーションで単独で使用できます。しかし、両者はPrisma CLIを介してシームレスに統合されており、連携してうまく機能します。
両ツールに共通する基盤は、2つの責任を持つデータモデル定義です。
- Photonの場合、生成されるデータベースクライアント(CRUD API)のモデルを提供します。
- Liftの場合、基盤となるデータベースのスキーマを記述します。
データモデルは、PhotonとLiftのワークフローの中心です。これは、データベーススキーマとデータベースとやり取りするために使用するプログラマティックAPIの間で、中間的な抽象化として機能します。
Prisma 2のはじめ方
更新 (2020年1月): このブログ記事のセクションは古くなっています。このブログ記事が公開されて以来、Prisma 2のセットアップ手順は変更されました。GitHubのPrisma 2公式ドキュメントではじめられます。
1. Prisma 2 CLIをインストール
npmまたはYarnを使用してPrisma 2 CLIをインストールできます。
2. 対話型prisma2 init
フローを実行し、ボイラープレートを選択
開始するには、以下のコマンドを実行してください。
対話型プロンプトで以下を選択します。
- SQLiteを選択
- PhotonとLiftの両方のオプションをチェック
- TypeScriptを選択
- 一からを選択
完了すると、init
コマンドによって初期プロジェクトのセットアップが作成されます。
hello-prisma2
ディレクトリに移動し、Nodeの依存関係をインストールします。
3. Liftでデータベースをマイグレーション
Liftでデータベースをマイグレーションするには、2つのステップが必要です。
- 新しいマイグレーションを保存する(マイグレーションはファイルシステム上のディレクトリとして表現されます)
- マイグレーションを実行する(基盤となるデータベースのスキーマを実際にマイグレーションするため)
CLIコマンドでは、これらのステップは次のように実行できます (CLIの手順は現在更新中です)。
4. Photonでデータベースにアクセス
src/script.ts
内のスクリプトには、以下のようなAPI呼び出しのサンプルが含まれています。
package.json
からシードスクリプトを使用してデータベースにシードできます。
以下のコマンドでスクリプトを実行できます。
5. アプリケーションを構築
Photonがデータベースに接続されたので、これでアプリケーションの構築を開始できます。photonjs
リポジトリには、以下のユースケース(JavaScriptとTypeScript用)の参照例があります。
Prismaが既存のDBツール/ORMと異なる理由
開発者は通常、日々のデータベースワークフローのために、既存のデータベースツールとカスタム/手書きのデータベースツールを組み合わせて使用します。Prismaは、主要なデータベースワークフローを一貫したエコシステムに統合し、開発者の生産性を向上させます。
Prismaは宣言的なデータモデルを使用
Prismaでは、宣言的で人間が読みやすいデータモデリング構文を使用してモデルを定義します。定義されたモデルは、基盤となるデータベースにマッピングされ、同時にPhotonが生成するデータアクセスAPIの基盤となります。
このアプローチのもう一つの大きな利点は、データモデル定義をバージョン管理にチェックインできるため、チーム全体がアプリケーションの基盤となるモデルを常に把握できることです。
Photonは型安全で自動生成されるデータベースクライアント
従来のORMは、大規模アプリケーションの複雑な要件に対応できないことが多いですが、データマッピング層は依然として必要です。典型的な解決策は、アプリケーションモデル用のカスタムデータアクセス層を手書きすることです。
Photonは、アプリケーションのために手動で記述するデータアクセス層を置き換える自動生成コードです。自動生成されることで、一貫性のあるAPIが保証され、人的エラーが減少し、CRUDのボイラープレートコードの記述に費やす時間を大幅に節約できます。
Photonは完全に型安全なAPIを提供します(JavaScriptでも)。このAPIは、より高度なORMパターン(リポジトリ、アクティブレコード、エンティティなど)を構築するための基盤として使用できます。
開発者体験と人間工学へのフォーカス
ほとんどの従来のORMがSQLをプログラミング言語に単純に抽象化しようとする一方、PhotonのデータアクセスAPIは開発者を念頭に置いて設計されています。
特にリレーションを扱う場合、PhotonのAPIは従来のORMと比較してはるかに開発者フレンドリーです。JOINやアトミックトランザクションは、ネストされたAPI呼び出しにエレガントに抽象化されています。いくつか例を挙げます。
PhotonのリレーションAPIの詳細については、ドキュメントをご覧ください。
Liftによるシンプルかつ複雑なユースケース向けの安全で弾力性のあるマイグレーション
データベーススキーマのマイグレーションは、信じられないほど時間のかかる、フラストレーションのたまる経験となりがちです。Liftは、最も複雑なユースケースにも十分対応できる、シンプルなマイグレーションモデルを開発者に提供します。
ほとんどの場合、開発者は宣言的なデータモデル定義を調整して目的のデータベース構造を表現し、その後マイグレーションを保存して実行するだけです。
このワークフローがニーズに合わない場合は、「before/after」フックを使用して、マイグレーション実行前後にカスタムコードを実行するように拡張できます。
マイグレーションフォルダ(およびデータベース内のマイグレーション履歴テーブル)により、開発者はマイグレーションのロールバックを簡単に行うことができます。
LiftはCI/CD環境でもシームレスに機能するように設計されています。将来的には、Liftは(ZEITのイミュータブルデプロイに触発された)イミュータブルスキーマデプロイを可能にします。
Prisma 2の新機能
Prisma 2は、Prismaの主要なワークフローをスタンドアロンツールに分割するだけでなく、各ツール自体に根本的な改善を加え、将来の開発のための堅牢なコアを提供します。
改善されたデータモデル構文とプロジェクト定義
Prisma 1では、すべてのPrismaプロジェクトで2つのファイルが必要でした。
prisma.yml
: プロジェクトのルート設定ファイルdatamodel.prisma
: データベースを抽象化し、生成されるPrismaクライアントAPIの基盤を提供
Prisma 2では、設定オプションとデータモデルが1つのPrismaスキーマファイル(通常schema.prisma
という名前)に統合されました。
開発者はスキーマファイルでデータモデルを定義し、さまざまなデータソースへの接続方法や、(photonjs
-ジェネレーターのような)ターゲットとなるコードジェネレーターを指定します。新しいプロジェクト定義の簡単な例は以下のようになります。
Prisma 2には、データモデリング構文用の自動フォーマットとシンタックスハイライト(および自動補完、定義へのジャンプ、リンティングなどの機能が間もなく追加予定)を提供するVS Code拡張機能も付属しています!
改善されたデータモデリング構文の詳細については、ドキュメントをご覧ください。
Prisma 1ユーザーへの注意: 新しいデータモデル構文はSDLから大きな影響を受けています。これはデータベーススキーマを記述するために最適化されていますが、ほとんどのユースケースではPrisma 1のデータモデル定義と非常によく似た感覚で使用できます。詳細については、仕様をご覧ください。
Photonにおける改善されたデータアクセスAPIと型安全なフィールド選択
Photonは、PrismaクライアントAPIと比較して、いくつかのわずかな変更と改善が加えられた強力なデータアクセスAPIを提供します。完全なAPIドキュメントはこちらで確認できます。
CRUD操作へのアクセスを統合
CRUD操作はモデル間で統一されており、Photonインスタンスのプロパティを介してアクセスできます。例えば、User
モデルの場合、データの読み書き操作には次のようにアクセスできます。
users
プロパティの名前は、pluralize
パッケージを使用して生成されることに注意してください。Photon.jsのAPIリファレンスはドキュメントで確認できます。
select
およびinclude
による型安全なフィールド選択
PhotonのデータアクセスAPIのまったく新しい機能は、API操作から返されるフィールドを型安全な方法で正確に指定できることです。これは、任意のCRUD API呼び出しに渡すことができる2つのオプションのいずれかを介して行われます。
include
はまだPhoton.js APIの一部ではありませんが、まもなく追加されます!
Photon APIが上記のデータモデルから生成されたと仮定すると、select
とinclude
の使用例は以下の通りです。
このコードスニペットはfindOne
に対するselect
とinclude
のみを強調していますが、これらのオプションは他のあらゆるCRUD操作(findMany
、create
、update
、delete
)にも提供できます。
Photon.jsのフィールド選択APIの詳細については、ドキュメントをご覧ください。
Prismaサーバーをオプション化
Prisma 1でデータベースプロキシとして必要だったPrismaサーバーは、オプションになりました。
これは根本的なアーキテクチャ変更によるものです。以前Prismaサーバー内で実行されていたクエリエンジンとマイグレーションエンジンが、アプリケーションと同じホスト上で通常のバイナリとして実行できるようになりました。
PrismaコアをRustで再記述
Prisma 1はScalaで実装されており、JVM上で動作する必要があります。Prismaを実行するオーバーヘッドを削減するため、Rustで再記述することを決定しました。
Rustの利点としては、大幅に低いメモリ使用量、優れたパフォーマンス、そしてPrisma 2を実行するための追加サーバーのデプロイ、監視、メンテナンスが不要になることが挙げられます。
RustはPrismaにとって完璧な言語であることが示されており、安全で非常に高性能なコードを記述することを可能にしています。
Prisma 2の安定化と将来の破壊的変更の回避
Prisma 2には多くの破壊的変更が導入されていますが、これらは根本的な改善をもたらし、シンプルかつ複雑なアプリケーションのためのモダンなデータレイヤーを構築するという私たちのビジョンを実現するために必要であると強く信じています。
将来的に安定した基盤を築くため、プレビュー期間に多大な投資を行っています。プレビュー期間中は、まだ破壊的変更があるかもしれません。GAリリース後には、安定した、破壊的変更のないAPIを提供することをお約束します。
発生した問題をご報告いただくか、ドキュメントに記載されていない質問をして、私たちにご協力ください。
さらに、Prisma 2の特定の側面を深く掘り下げるブログ記事を多数計画しています。これには、Rustでの再記述、Liftの内部動作、多くの技術的決定の動機付けやコアデザイン原則を説明する記事などが含まれます。
特定の機能が必要ですか?フィードバックをお寄せください!
Prisma 2の現状に大変興奮していますが、ここで立ち止まるつもりはありません。私たちが下した決定の中には議論の余地があるものもあると承知していますので、強いご意見をお持ちの方は、ぜひ議論にご参加いただき、ご意見、アイデア、フィードバックを共有してください!
最終的にPrisma 2がどのようなものになるかを形作る上で影響を与えたいのであれば、今が参加する絶好の機会です!Slackの#prisma2-previewチャンネルにご意見をお寄せいただくか、lift
またはphotonjs
リポジトリでイシューを作成してください。
Prisma Dayでお会いしましょう
今週のワクワクする出来事は、Prisma 2 プレビューだけではありません。今後開催される3日間のカンファレンスに私たちは興奮しています。
- Prisma Day (完売)
- GraphQL Conf (レイトバードチケットまだ購入可能)
特に、Prisma DayでPrismaコミュニティを迎え、刺激的なトークと素晴らしい会話の一日を過ごすことを楽しみにしています。皆さん、明日お会いしましょう!🙌
次の投稿をお見逃しなく!
Prismaニュースレターに登録