2019年6月18日

Prisma 2 プレビュー: 型安全なデータベースアクセスと宣言的なマイグレーション

本日、Prisma 2 プレビューを公開できることを大変嬉しく思います。これは、型安全なデータベースクライアント (Photon) と 宣言的なマイグレーションシステム (Lift) を特徴としています。ぜひお試しいただき、フィードバックを共有してPrisma 2 の改善にご協力ください!

これはPrisma 2の初期プレビュー版です。現在の制限には、不足している機能、限られたパフォーマンス、安定性の問題が含まれます。年内の安定版リリースまでに、これらの制限はすべて対処する予定です。

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

概要

本日、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のセットアップ手順は変更されました。GitHubのPrisma 2公式ドキュメントではじめられます

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

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

2. 対話型prisma2 initフローを実行し、ボイラープレートを選択

開始するには、以下のコマンドを実行してください。

対話型プロンプトで以下を選択します。

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

完了すると、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の基盤となります。

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

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つのオプションのいずれかを介して行われます。

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

includeはまだPhoton.js APIの一部ではありませんが、まもなく追加されます!

Photon APIが上記のデータモデルから生成されたと仮定すると、selectincludeの使用例は以下の通りです。

このコードスニペットはfindOneに対するselectincludeのみを強調していますが、これらのオプションは他のあらゆるCRUD操作(findManycreateupdatedelete)にも提供できます。

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リポジトリでイシューを作成してください。


Prisma Dayでお会いしましょう

今週のワクワクする出来事は、Prisma 2 プレビューだけではありません。今後開催される3日間のカンファレンスに私たちは興奮しています。

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

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

Prismaニュースレターに登録

© . All rights reserved.