March 19, 2019

PrismaとGraphQLの連携

PrismaとGraphQLの関係については多くの混乱があります。この記事では、GraphQLとPrismaについて開発者がどのように考えるべきかを明確にし、Prismaの将来について概説します。

How Prisma and GraphQL fit together

要約:GraphQLはPrismaの多くのユースケースの一つです

私たちはGraphQLを愛しており、その明るい未来を強く信じています!私たちはGraphQLエコシステムへの投資を継続し、Prismaをデータベース駆動型GraphQLサーバーを構築するための最良のツールにすることを目指します。その取り組みの一例は、GraphQLにRuby on Railsのような体験をもたらすYoga2フレームワークです。

PrismaはORMに代わるものであり、RESTgRPC APIの構築など、GraphQL以外にも多くのユースケースがあります。Prismaの目標は、データベースワークフローを簡素化することです。データベースアクセス、移行、データ管理を容易にするデータベースツールのスイートと考えてください。


歴史:GraphQLからORMとデータベースへ

簡単な歴史のレッスンから始め、Prismaが今日に至るまでにどのように進化してきたかを振り返ってみましょう。

GraphQL to ORMs

1) Graphcool:フロントエンド開発者向けにGraphQLを容易に

Prismaのローンチと公式リブランディング以前は、当社のコア製品はGraphcool(オープンソースのGraphQL BaaS)でした。Graphcoolの当初からの目標は、開発者がGraphQLをできるだけ簡単に使用できるようにすることでした。

Graphcoolはバックエンドスタック全体を表していたため、アーキテクチャはシンプルでした。データベース、アプリケーション層、GraphQL APIが含まれていました

Graphcool is the entire backend: Database, application layer and GraphQL API

Graphcoolを2年間本番環境で運用した後、お客様からのフィードバックと要望が繰り返し寄せられていることに気づきました

  • Graphcoolはその使いやすさで愛されていました。開発者はプロトタイピングには使用しましたが、その後、独自のGraphQLサーバーを構築するために本番環境での使用を断念することがよくありました。
  • 開発者は、たとえば、バックエンドスタックにおいてより多くの制御と柔軟性を求めていました
    • データベースをAPI層から分離する
    • (汎用的なCRUDではなく)独自のドメイン駆動型GraphQLスキーマを定義する
    • プログラミング言語、フレームワーク、テスト、CI/CDツールを選択する際の柔軟性

2) Prisma Bindings:任意のデータベースでGraphQLサーバーを構築する

開発者が高度なGraphQLバックエンドを構築するために必要な要件は、Graphcoolのようなツールでは満たされないことは明らかでした。この認識がPrismaにつながりました。Prismaの最初のバージョンは、Graphcoolのクエリエンジンコンポーネントのスタンドアロンバージョンでした。

Prismaをスタンドアロンコンポーネントとして利用できるようにすることで、開発者はデータベース用のCRUD GraphQL APIを迅速に生成する機会を得ました。このAPIはフロントエンドから消費されるものではありませんでした。代わりに、ビジネスロジックを追加し、クライアント側のAPIをカスタマイズするために、その上にアプリケーション層を追加することを考えました。

このアプリケーション層はPrisma bindingsを使用して実装されました。メンタルモデルでは、開発者は2つのGraphQL API(生成されたCRUD APIの上にカスタムクライアント側API)を扱っていることを理解する必要がありました

When working with Prisma bindings, developers need to understand the concept of two GraphQL APIs

Prismaの主な目標は依然として、開発者がGraphQLをできるだけ簡単に使用できるようにすることでしたが、焦点はGraphQLリゾルバーをデータベースに接続するデータアクセス層になることにシフトしました。

3) Prisma Client:従来のORMを置き換える

多くのお客様とPrismaコミュニティに話を聞いた後、Prismaが何であるか(そして最終的に何になる可能性があるか)についての私たちの理解は、再び大きく進化しました。

Prisma BindingsでGraphQLサーバーを構築する以前のアプローチにはいくつかの問題がありました

  • Prisma Bindingsは始めるのは簡単でしたが、より高度なユースケースで開発者が理解する必要がある概念の複雑さは(スキーマ委譲infoオブジェクトの複雑さのために)非常に高くなりました。
  • 完全にタイプセーフなリゾルバーを実現することは非常に難しく、非現実的でした。
  • JavaScriptエコシステムに限定されていました。
  • ユースケースとしてGraphQLに限定されていました。

Prisma Clientはこれらの問題を解決します。シンプルで完全にタイプセーフなデータアクセスAPIを備えた自動生成データベースクライアントです。

この新しいアプローチでは、生成されたCRUD GraphQL APIはもはやコアPrisma開発ワークフローの一部ではありません。むしろ実装の詳細になります

Simplified mental model: Developers only need to understand the Prisma client API

ごく近いうちに、アプリケーションサーバー内で直接使用できるPrismaのバージョンが登場し、追加のPrismaサーバーの必要がなくなることに注意してください

The upcoming Prisma 2 will enable running Prisma without an extra server

Prisma Client APIは今日すでに最高のデータアクセスAPIの1つであると信じていますが、多くのコミュニティからのフィードバックがそれをさらに改善するのに役立ちました。その結果、非常に強力で直感的なデータベースAPIが間もなくリリースされます。

Prisma Clientにはdataloaderが組み込まれているため、GraphQLサーバーでリゾルバーを実装するのに最適なツールです。


Prismaの生成されたGraphQL APIについてどのように考えるべきか

生成されたPrisma GraphQL CRUD APIが実装の詳細と見なされることを理解することは、Prismaの焦点と将来の方向性を理解する上で非常に重要です。

宣言的なデータモデルから生成されたGraphQL CRUDへ

Prismaの核となるアイデアは常に同じでした

  1. 開発者はGraphQL SDLでデータモデルを定義し、データベースにマッピングします
  2. Prismaはデータモデルに基づいて強力なCRUD GraphQL APIを生成します
  3. 生成されたCRUD GraphQL APIは、アプリケーション層とクライアント側のAPIの基盤として使用されます(Graphcoolを除く

生成されたCRUD GraphQL APIはPrisma Bindingsでは絶対に不可欠でしたが、Prisma Clientでは実装の詳細になりました。

これは、Prisma Webサイトの最新の再設計にも反映されており、Prisma ClientがGraphQLに代わって主要なテーマになっています

New Prisma website

PrismaのCRUD GraphQL APIの重要性を低下させる

今日、開発者はPrisma Clientが基盤となるデータベースとどのように通信するかを気にする必要はありません。開発者が気にする必要があるのは、Prisma Client APIです!

これを公式ドキュメントに反映するために、最新のPrismaリリースでPrisma GraphQL APIドキュメントを削除しました。ドキュメントがまだ必要な場合は、ドキュメント内の古いPrismaバージョンに移動してアクセスできます。

また、(GraphQL Playgroundに加えて)Prismaプロジェクトのデータを操作するための追加ツールとしてPrisma Adminを導入しました。

GraphQL SDLでのデータモデリング

PrismaとGraphQLに関するもう1つの一般的な混乱の原因は、データモデリングである可能性があります。Prismaを使用する場合、データモデルはGraphQLのスキーマ定義言語(SDL)のサブセットを使用して指定されます。

データモデルのファイルタイプを.graphqlから.prismaにすでに調整しましたが、データモデリングにSDLを使用することは、依然としてGraphQLとの強い結びつきがあります。ただし、現在、独自のモデル言語(SDLの修正版になります)に取り組んでいます。

PrismaとAWS AppSyncおよびHasuraの比較

PrismaのCRUD GraphQL APIの役割についての新しい理解により、Prismaはもはや「GraphQL-as-a-Service」のカテゴリにはないことが明らかになります。

AWS AppSyncHasuraのようなツールは、データベース(またはAppSyncの場合は他のデータソースも)用に生成されたGraphQL APIを提供します。対照的に、Prismaはさまざまな言語で簡素化されたタイプセーフなデータベースアクセスを可能にします。


GraphQLはPrismaの重要なユースケースです

Prisma Clientがリリースされて以来、Prismaが内部でGraphQLを使用することは実装の詳細と見なされています。それでは、GraphQLはPrismaにとってどのような役割を果たすのでしょうか?

私たちはGraphQLを愛しています

答えは私たちにとって明確です。私たちは依然としてGraphQLを最も重要な今後のAPIテクノロジーの1つと見ており、開発者がGraphQLサーバーをできるだけ簡単に構築できるようにしたいと考えています。GraphQLは、Prismaにとって依然として重要なPrismaのユースケースです!

GraphQLエコシステムへの投資

私たちはオープンソースのGraphQLエコシステムへの投資を継続します。私たちが構築したツールの多くは、GraphQL Playgroundgraphql-yogaGraphQL NexusTim Griesserによって構築)など、多くのGraphQL開発ワークフローでデフォルトになっています。

最近発表されたnexus-prismaにより、Prismaの上にGraphQLサーバーを実装することが非常に簡単になります。今後のYoga2フレームワークでは、GraphQLにRuby on Railsの開発者体験を作り出すことをさらに目指しています。

GraphQLコミュニティへの貢献

GraphQLエコシステムに投資しているのと同じように、GraphQLコミュニティにも貢献したいと考えています。私たちは世界最大のGraphQLコミュニティカンファレンスを運営し、How to GraphQLGraphQL Weeklyなどの人気のあるリソースを維持しています。

最初に参加した企業の1つではありませんでしたが、GraphQL Foundationに参加し、その将来の方向性を導く手助けをすることも計画しています。


🔮 将来の展望

この投稿全体で強調されているように、私たちはPrismaに対する多くのエキサイティングで基本的な改善に取り組んでいます。私たちが取り組んでいることの概要については、ロードマップをご覧ください。

今後のすべての機能を公開で(GitHub issuesとRFCプロセスを介して)仕様化していますので、GitHubでディスカッションに参加して、ご意見をお聞かせください!

ご質問やご意見がありましたら、Spectrumで共有してください

採用中です!ご覧のとおり、ロードマップの項目の1つは、RustでのPrismaコアの完全な書き換えです。Rustエンジニアの方、または高度な技術的課題やオープンソース開発に一般的に興味がある方は、ぜひ採用ページをご覧ください。

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

Prismaニュースレターに登録する