2019年6月18日

Prisma 2 Preview: タイプセーフなデータベースアクセスと宣言的なマイグレーション

本日、Prisma 2 Previewを公開できることを嬉しく思います。これは、タイプセーフなデータベースクライアントPhoton)と宣言的なマイグレーションシステムLift)を備えています。Prisma 2を試してフィードバックを共有し、Prisma 2の改善にご協力ください!

これはPrisma 2の初期プレビュー版です。現在の制限事項には、機能の欠落、パフォーマンスの制限、および安定性の問題が含まれます。これらの制限事項はすべて、今年後半の安定版リリース前に対応する予定です。

Prisma 2 Preview: Type-safe Database Access & Declarative Migrations

TLDR

本日、Prisma 2の最初のプレビュー版をリリースします。これは、データベースのワークフローを簡素化および最新化する2つの主要なツールで構成されています。

  • Photon:タイプセーフで自動生成されるデータベースクライアント(例:ORM
  • Lift:宣言的なデータモデリングとデータベースマイグレーション

PhotonとLiftは、アプリケーションでスタンドアロンまたは一緒に使用できます。Prisma 2は数か月間プレビュー版として実行されます。ぜひ試してみて、フィードバックをお寄せください!


目次

2019年のデータベースワークフローは時代遅れ

近年、アプリケーション開発の多くの分野が、デジタル化の時代によってもたらされた新しい要件に適合するように近代化されてきました。

  • フロントエンドのWebアプリケーションは通常、静的なHTMLとjQueryを使用する代わりに、DOM(React、Vueなど)の宣言的な抽象化によって駆動されています。
  • バックエンドの開発者は、Node.js、Go、Elixirなどの最新の言語とランタイムを利用して、ユースケースに最適なトレードオフを実現できます。
  • コンピューティングは、かつてプライベートデータセンターでプロビジョニングされていました。今日、ほとんどのワークロードは、パブリッククラウドのコンテナまたはサーバーレスで実行できます。
  • ストレージソリューションは、セルフホストからRDSやAzure Storageのようなマネージドサービスに移行しています。

しかし、開発者が日々対処しているデータベースワークフローはどうでしょうか?アプリケーション内からデータベースにアクセスしたり、スキーママイグレーションを実行したりするための次世代ツールは何でしょうか?

Confusion with data management

データベースアクセスの場合、開発者は従来のORM(例:Node.js用のSequelizeやGo用のGORM)を使用できます。プロジェクトを軌道に乗せるのに役立つことが多いですが、プロジェクトの複雑さが従来のORMの能力をすぐに上回ってしまうため、長期的な適合性は高くありません。

スキーママイグレーションのツールとベストプラクティスはさらに断片化されており、組織はデータベーススキーマを移行するための独自のツールとプロセスを開発する傾向があります。

Prisma 2:次世代データベースツール

過去3年間、大企業や個々の開発者がデータアクセスに関する課題を解決するのを支援してきた私たちは、開発者が最新の開発スタックでデータベースを操作するのに役立つツールセットをリリースできることを誇りに思っています。

Prisma 2は、データアクセスとマイグレーションの問題に取り組むための2つのスタンドアロンツールを包含しています。

  • Photon:より効率的で安全なデータベースアクセスのためのタイプセーフなデータベースクライアント
  • Lift:カスタムワークフローを備えたモダンで宣言的なマイグレーションシステム

PhotonとLiftを詳しく見ていきましょう。

Photon – 従来のORMを置き換えるタイプセーフなデータベースクライアント

Photon.js diagram

Photonは、Prismaデータモデル(データベーススキーマの表現)に基づいて自動生成されるタイプセーフなデータベースクライアントです。これは、アプリケーションでデータベースと対話するために使用できる、強力で軽量なマッピングコード層を提供します。

アプリケーション開発者のニーズに合わせて調整された、モダンで人間工学に基づいたデータアクセスAPIを備えています。Photon APIは、Photonサイトで探索できます。

Lift – 宣言的なデータモデリングとマイグレーション

Lift demo

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のセットアップ手順は、ブログ投稿が最初に公開されてから変更されました。公式Prisma 2ドキュメントのGitHubではじめにを参照してください。

1. Prisma 2 CLIをインストールする

Prisma 2 CLIは、npmまたはYarnを使用してインストールできます。

2. インタラクティブなprisma2 initフローを実行し、ボイラープレートを選択する

開始するには、次のコマンドを実行します。

インタラクティブプロンプトで以下を選択します。

  1. SQLiteを選択
  2. PhotonLiftの両方のオプションをチェック
  3. TypeScriptを選択
  4. From scratchを選択

initコマンドが終了すると、初期プロジェクトセットアップが作成されます。

hello-prisma2ディレクトリに移動し、Node依存関係をインストールします。

3. Liftでデータベースを移行する

Liftを使用したデータベースの移行は、2段階のプロセスに従います。

  1. 新しいマイグレーションを保存します(マイグレーションはファイルシステムのディレクトリとして表されます)。
  2. マイグレーションを実行します(基盤となるデータベースのスキーマを実際に移行するため)。

CLIコマンドでは、これらの手順は次のように実行できます(CLIの手順は、一致するように更新中です)。

4. Photonでデータベースにアクセスする

src/script.tsのスクリプトには、いくつかのサンプルAPI呼び出しが含まれています。例:

package.jsonのシードスクリプトを使用してデータベースにシードを投入できます。

次のコマンドでスクリプトを実行できます。

5. アプリを構築する

Photonがデータベースに接続されたので、アプリケーションの構築を開始できます。photonjsリポジトリでは、次のユースケースのリファレンス例(JavaScriptおよびTypeScript用)を見つけることができます。


Prismaが既存のDBツール/ ORMと異なる理由

開発者は通常、日常のデータベースワークフローに既存のツールとカスタム/手書きのデータベースツールを組み合わせて使用​​します。Prismaは、主要なデータベースワークフローを首尾一貫したエコシステムに統合し、開発者の生産性を向上させます。

Prismaは宣言的なデータモデルを使用する

Prismaを使用すると、宣言的で人間が理解しやすいデータモデリング構文を使用してモデルを定義できます。定義されたモデルは、基盤となるデータベースにマッピングされると同時に、Photonの生成されたデータアクセスAPIの基盤を提供します。

このアプローチのもう1つの大きな利点は、データモデル定義をバージョン管理にチェックインできるため、アプリケーションの基盤となるモデルをチーム全体が常に認識できることです。

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では、構成オプションとデータモデルが単一のPrismaスキーマファイル(通常はschema.prismaと呼ばれる)にマージされました。

開発者はデータモデルを定義し、さまざまなデータソースへの接続方法と、photonjsジェネレーターなどのターゲットコードジェネレーターをスキーマファイルで指定します。新しいプロジェクト定義の簡単な例を次に示します。

Prisma 2には、データモデリング構文の自動フォーマット構文ハイライト(および自動補完、定義へのジャンプ、リントなどのその他の機能も近日公開予定)を提供するVS Code拡張機能も付属しています!

改善されたデータモデリング構文の詳細については、ドキュメントを参照してください。

Prisma 1ユーザーへの注意:新しいデータモデル構文は、SDLに大きく影響を受けています。データベーススキーマを記述するために最適化されていますが、ほとんどのユースケースでは、Prisma 1データモデルを定義する場合と非常によく似た感覚で使用できます。詳細については、仕様を参照してください。

改善されたデータアクセスAPIとPhotonでのタイプセーフなフィールド選択

Photonは、PrismaクライアントAPIと比較して、いくつかのわずかな変更と改善を加えた強力なデータアクセスAPIを提供します。完全なAPIドキュメントはこちらにあります。

CRUD操作へのアクセスを統合する

CRUD操作は、モデル間で統合されており、Photonインスタンスのプロパティからアクセスできます。たとえば、モデルUserの場合、次のようにデータを読み書きする操作にアクセスできます。

usersプロパティの名前は、pluralizeパッケージを使用して生成されることに注意してください。Photon.jsのAPIリファレンスは、ドキュメントにあります。

selectおよびincludeによるタイプセーフなフィールド選択

PhotonのデータアクセスAPIの真新しい機能は、API操作から返されるフィールドをタイプセーフな方法で正確に指定できることです。これは、任意のCRUD API呼び出しに渡すことができる2つのオプションのいずれかを使用して実行できます。

  • select:明示的に指定されたフィールドのみを返します(排他的に選択)。
  • include:追加フィールド(例:リレーションまたは遅延プロパティ)を含めます(追加的に含める)。

includeは、まだPhoton.js APIの一部ではありませんが、近日中に追加される予定です!

Photon APIが上記のデータモデルから生成されたと仮定すると、selectincludeの使用例を次に示します。

このコードスニペットは、findOneselectincludeのみを強調表示していますが、これらのオプションを他のCRUD操作(findManycreateupdate、およびdelete)に提供できます。

Photon.jsのフィールド選択APIの詳細については、ドキュメントを参照してください。

Prismaサーバーをオプションにする

Prisma 1でデータベースプロキシとして必要だったPrismaサーバーは、オプションになりました。

これは、基本的なアーキテクチャの変更によるものです。以前はPrismaサーバー内で実行されていたクエリエンジンとマイグレーションエンジンが、アプリケーションと同じホスト上でプレーンバイナリとして実行できるようになりました。

Prisma client

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リポジトリでissueを開いてください。


Prisma Dayでお会いしましょう

Prisma 2 Previewは、今週起こるエキサイティングなことのほんの一部です。今後3日間のカンファレンスに興奮しています。

特に、PrismaコミュニティをPrisma Dayに迎え、刺激的な講演と素晴らしい会話の一日を過ごせることを楽しみにしています。明日お会いしましょう!🙌

次回の投稿をお見逃しなく!

Prismaニュースレターにサインアップする