GraphQL Nexusは、JavaScript/TypeScript向けのコードファーストでタイプセーフなGraphQLスキーマ構築ライブラリです。Prismaクライアントと新しいnexus-prisma
プラグインを使用して、どのようにデータベースに接続できるかをご覧ください。

⚠️ この記事は古くなっています。これは現在非推奨となっているPrisma 1に関するものです。Prismaの最新バージョンについては、ドキュメントをご覧ください。⚠️
まとめ: GraphQL Nexusによるコードファースト開発
前回の記事では、TypeScriptとJavaScript向けのコードファースト開発を可能にするGraphQLライブラリであるGraphQL Nexusを紹介しました。Nexusでは、GraphQLスキーマがプログラム的に定義され、実装されます。そのため、sangria-graphql
(Scala)、graphlq-ruby
、またはgraphene
(Python)など、他の言語でのGraphQLサーバーの実績あるアプローチを踏襲しています。
本日の記事では、Prismaクライアントと新しいnexus-prisma
プラグインを使用して、NexusベースのGraphQLサーバーをデータベースに接続する方法について説明します。後ほど、ブログアプリ向けのGraphQL APIをゼロから構築する実践的な例をご紹介します。
nexus-prisma
はPostgreSQL、MySQL、MongoDBで動作します。詳細なドキュメントはこちらをご覧ください。
TLDR: nexus-prisma
プラグインの利点
- GraphQLにおけるPrismaモデルのCRUD操作
- Prismaモデルのカスタマイズ(例: 特定のフィールドを非表示にする、計算フィールドを追加する)
- 完全なタイプセーフティ: GraphQLスキーマとデータベースのための整合性のある型セット
- GraphQLエコシステムとの互換性(例:
apollo-server
、graphql-yoga
、など)
nexus-prisma
ワークフローの理解
ORMの代替としてのPrismaクライアント
Prismaをこれまで使用したことがない方のために、その動作を簡単に説明します
- データモデルを定義するか、Prismaに既存のデータベースを内省させる
- Prismaクライアント(タイプセーフなデータベースクライアント)を生成する
- Prismaクライアントを使用して、アプリケーション(例: GraphQL API)でデータベースにアクセスする
nexus-prisma
プラグインの内部動作
nexus-prisma
を追加する場合、もう1つのステップがあります。nexus-prisma-generate
コード生成CLIを呼び出すことです。これは、Prismaモデル向けの本格的なGraphQL CRUD APIの構成要素を生成します。例えば、User
モデルの場合、以下のものが含まれます
- クエリ
user(...): User!
: 単一のレコードを取得するusers(...): [User!]!
: レコードのリストを取得するusersConnection(...): UserConnection!
: リレーコネクション & 集計
- ミューテーション
createUser(...): User!
: 新しいレコードを作成するupdateUser(...): User
: レコードを更新するdeleteUser(...): User
: レコードを削除するupdatesManyUsers(...): BatchPayload!
: 複数のレコードを一括で更新するdeleteManyUsers(...): BatchPayload!
: 複数のレコードを一括で削除する
- GraphQL入力型
UserCreateInput
: レコードのすべてのフィールドをラップするUserUpdateInput
: レコードのすべてのフィールドをラップするUserWhereInput
: レコードのすべてのフィールドのフィルターを提供するUserWhereUniqueInput
: レコードの一意なフィールドのフィルターを提供するUserUpdateManyMutationInput
: 一括更新が可能なフィールドをラップするUserOrderByInput
: フィールドによる昇順または降順の並び順を指定する
UserCreateInput
とUserUpdateInput
は、リレーションフィールドの扱い方が異なります。
nexus
とnexus-prisma
でGraphQLサーバーコードを記述する際、これらの操作を公開し、自身のAPIニーズに合わせてカスタマイズすることで構築します。

CRUDの構成要素を生成した後、nexus-prisma
のprismaObjectType
を使用して、それらを公開(およびカスタマイズ)し始めることができます。以下のコードスニペットは、Prismaとnexus-prisma
に基づいたTODOリストアプリ向けのGraphQL APIを提供する実装を示しています。
私たちはprismaObjectType
をQuery
とMutation
に適用しています。Query
では、すべてのフィールド(つまりtodo
、todoes
、todoesConnection
)を保持しています。Mutation
では、公開される操作をカスタマイズするためにprismaFields
を使用しています。
prismaFields
は公開する操作を選択することを可能にします。このケースでは、モデルを作成する操作(createTodo
)のみを保持したいと考えています。生成されたCRUD構成要素の中から、updateTodo
もdeleteTodo
も含まれていませんが、特定のTodo
にチェックを入れる独自のmarkAsDone(id: ID!)
ミューテーションを実装しています。
例: 標準CRUDからカスタマイズされたGraphQL APIへ
それでは、標準的なPrismaのユースケースを簡単に見て、ブログアプリ向けのGraphQL APIを数ステップで素早く構築する方法を確認しましょう。以下がその手順です
- TypeScriptを使用してPrismaプロジェクト(無料のデモデータベースを使用)をセットアップする
- モデルを定義し、データベースをマイグレートしてPrismaクライアントを生成する
nexus-prisma
経由で完全なCRUD GraphQL APIを公開するnexus-prisma
経由でGraphQL APIをカスタマイズする
一緒に作業を進めるには、Prisma CLIがインストールされている必要があります
1) TypeScript、nexus
、nexus-prisma
でPrismaプロジェクトをセットアップする
このセクションは主にプロジェクトのセットアップに関するものです。コードを一緒に書かない場合はスキップしても構いませんが、そうでない場合は以下のセクションを展開してください。
Prisma CLIを使用してシンプルなPrismaプロジェクトを作成する
対話型プロンプトで、以下のオプションを選択します
- ブラウザでPrisma Cloudと認証します(必要な場合)
- ターミナルに戻り、提案されたすべての値を確定します
- ブラウザでPrisma Cloudと認証します(必要な場合)
デモサーバーの代わりに、Dockerを使用してPrismaをローカルで実行することもできます。
次に、nexus-prisma
ワークフローを設定する必要があります。以下の依存関係を追加します(myblog
ディレクトリ内)
次に、以下の2行をprisma.yml
の末尾に追加します
これにより、モデルに変更を加えるたびに、Prismaクライアントと生成されたnexus-prisma
のCRUD構成要素が確実に更新されます。
TypeScriptを使用しているため、手早くtsconfig.json
を追加しましょう
最後に、開発に使用するstart
スクリプトを追加します。これは、バックグラウンドでファイルを監視し、コードを記述するにつれて生成されたSDLとNexusの型定義を更新する開発サーバーを起動します。これをpackage.json
に追加してください
2) モデルの定義、データベースのマイグレーション、Prismaクライアントの生成
prisma init
コマンドは、datamodel.prisma
にデフォルトのUser
モデルを作成しました。ブログアプリケーションを構築するため、モデルをアプリケーションドメインに合わせて調整しましょう
次に、データモデルをデータベースに適用してマイグレートする必要があります。以下のコマンドを使用すると、datamodel.prisma
で定義された各モデルが基盤となるデータベースのテーブルにマッピングされます
以前にprisma.yml
でpost-deploy
フックを設定したため、PrismaクライアントとCRUD構成要素は自動的に更新されます。
3) nexus-prisma
経由で完全なCRUD GraphQL APIを公開する
プロジェクトの初期段階では、APIによって完全なCRUD機能が公開されていると役立つことがよくあります。より制約されたAPI要件は通常、時間とともに現れます。nexus-prisma
は、完全なCRUDからカスタマイズされたAPI操作へ移行するための直接的なパスを提供することで、これを完全に考慮しています。
定義されたモデルに対して完全なCRUD(これにはフィルター、ページネーション、ソートが含まれます)を公開するGraphQL APIから始めましょう。index.ts
という新しいファイルを作成し、以下のコードを追加してください
この短いチュートリアルではファイル構造にあまり注意を払っていません。適切なセットアップとモジュール化されたスキーマについては、
graphql-auth
の例を確認してください。
npm run start
を実行した後、https://:4000
でGraphQLサーバーのGraphQL Playgroundを開くことができます。上記で書いたわずかなコードで、すでに本格的なGraphQL CRUD APIが利用可能です。
これはどのように機能するのでしょうか? nexus-prisma-generate
は、Prismaモデル(あなたのCRUD構成要素)向けのCRUD APIを提供するGraphQLスキーマを生成しました。このGraphQLスキーマはOpenCRUD仕様に準拠しています。prismaObjectType
関数を使用すると、そのスキーマの操作を公開およびカスタマイズできます。
prismaObjectType
とprismaFields
はホワイトリスト方式を採用しており、公開したいフィールドを明示的にリストアップする必要があります。ワイルドカード演算子*
はすべてのフィールドを含みます。

4) nexus-prisma
経由でGraphQL APIをカスタマイズする
このセクションでは、nexus-prisma
からのCRUD GraphQL APIをカスタマイズする方法を学びます。具体的には、以下のことを行います。
User
モデルからフィールドを隠すPost
モデルに計算フィールドを追加するcreatePost
とupdatePost
ミューテーションを隠す- 2つのカスタム
createDraft
とpublish
ミューテーションを追加する
4.1) User
モデルからフィールドを隠す
このセクションでは、User
モデルからemail
フィールドを隠します。
モデルをカスタマイズするには、prismaObjectType
関数を適用し、definition(t)
関数をオプションとして渡す必要があります。
モデルt
に対してprismaFields
を呼び出すことで、公開されるフィールド(およびその引数)をカスタマイズできます。email
がリストに含まれていないため、GraphQL APIから削除されます。

変更を適用するには、makePrismaSchema
内のtypes
配列にUser
を明示的に渡す必要があります。
エディターが、生成されたCRUD構成要素に基づいて、prismaObjectType
とprismaFields
に何を渡すべきか提案できることに注意してください。つまり、prismaObjectType('')
と入力してCtrl+Spaceを押すと、生成されたすべてのCRUD構成要素の名前が提案されます。t.prismaFields([''])
を呼び出すと、t
のフィールドが提案されます。
4.2) Post
モデルに計算フィールドを追加する
nexus-prisma
による新しいコードファーストアプローチでは、Prismaモデルに計算フィールドを簡単に追加することもできます。例えば、title
を常にすべて大文字で返すフィールドをPost
に追加したいとします。その実装方法は以下の通りです。
私たちはgraphql-nexus
から提供されるt.string(...)
APIを使用して、モデルに新しいフィールドを追加します。これは計算フィールドであるため(したがってnexus-prisma
によって自動的に解決されることはありません)、これにリゾルバーをアタッチする必要もあります。

これまでと同様に、カスタマイズされたPost
モデルをtypes
配列に明示的に追加する必要があります。
4.3) createPost
とupdatePost
ミューテーションを隠す
User
モデルからemail
フィールドを隠したのと同じ方法で、生成されたnexus-prisma
CRUD構成要素の一部であるQuery
/Mutation
型から操作を隠すこともできます。
createPost
とupdatePost
を隠すには、再度definition(t)
をオプションとしてprismaObjectType
に渡す必要があります。型に対してprismaFields
を呼び出した場合、保持したいすべてのフィールドを明示的にリストアップする必要があることに注意してください(空の配列は「操作を何も保持しない」と解釈されます)。
生成されたCRUD GraphQL APIには、バッチ処理とUPSERT操作も含まれていますが、ここでは簡潔にするためにそれらも除外しています。
4. 2つのカスタムcreateDraft
とpublish
ミューテーションを追加する
最後に、GraphQL APIに2つのカスタムミューテーションを追加します。それらのSDL定義は以下のようになります
これらのミューテーションを実装するには、Mutation
型に2つのフィールド(nexus
APIのt.field( ... )
を呼び出して)を追加する必要があります。
これを機能させるには、nexus
パッケージからstringArg
とidArg
をインポートしてください。
GraphQL Nexusは、GraphQLスキーマのSDLバージョンも生成します。これは./generated/schema.graphql
で見つかります。GraphQL APIの最終バージョンは以下のようになります
コードファーストGraphQL記事からの3つの重要なポイント
これで、コードファーストGraphQLサーバー開発に関する記事シリーズは最終回となります。
GraphQL Nexusとnexus-prisma
プラグインは、2年以上にわたるGraphQLエコシステムへの積極的な貢献から得た教訓を実装しています。SDLファーストのアプローチではあまりにも多くの問題が見つかったため、現在登場している新しいコードファーストのツールに非常に興奮しています。
私たちは、GraphQL Nexus(およびTypeGraphQLなどの他のコードファーストアプローチ)が、将来のGraphQLスキーマの構築方法を劇的に変えると強く信じています。
このシリーズからの主要なポイントは以下の通りです
- コードファーストアプローチは、追加のツールを必要とせず(「必要なツールはプログラミング言語だけ」)、SDLをコミュニケーションツールとしての利点を維持しつつ、言語の慣用的な方法でGraphQLサーバーを構築することを可能にします。
- GraphQL Nexusは、開発者が柔軟でタイプセーフなAPIでスキーマを構築できるようにします。自動補完とビルド時エラーチェックのおかげで、開発者は素晴らしい体験を得られます。
nexus-prisma
プラグインはPrismaモデルの上に構築されており、開発者が自動生成されたCRUD構成要素を公開およびカスタマイズすることでGraphQL APIを構築できるようにします。
今すぐnexus-prisma
を試してみましょう 🙌
nexus-prisma
を試す方法はいくつかあります。ドキュメントのGetting Startedセクションに従うか、TypeScript GraphQLの例を探索することができます。
GitHub issueを開くか、Slackで連絡することで、フィードバックを共有してください。
nexus-prisma
プラグインにおける素晴らしい仕事をしてくれた、私たちのオープンソースエンジニアFlavian Desverneに心から感謝します💪✨
次回の投稿をお見逃しなく!
Prismaニュースレターに登録する