Prisma & Apolloで簡単、タイプセーフなデータベースアクセス

Prismaを使ってGraphQLでMySQL、PostgreSQL、SQL Serverデータベースからデータをクエリ – JavaScriptとTypeScriptのためのより良いORM。

tech

Prismaとは?

Prismaはデータ操作を容易にします!タイプセーフなNode.js & TypeScript ORM、グローバルデータベースキャッシュ、接続プーリング、リアルタイムデータベースイベントを提供します。

クエリ
// Creating a new record
await prisma.user.create({
firstName: “Alice”,
email: “alice@prisma.io”
})
テーブル
id firstName email
1 Bobby bobby@tables.io
2 Nilufar nilu@email.com
3 Jürgen jums@dums.edu
4 Alice alice@prisma.io

PrismaとApolloの連携

ApolloはGraphQLでアプリケーションを構築するための素晴らしいエコシステムを提供します。Apollo Serverでデータベースに対してGraphQL APIを構築する際、GraphQLリゾルバー内でデータベースクエリを送信する必要があります – そこでPrismaが登場します。

PrismaはApollo ServerのGraphQLリゾルバー内でデータベースをクエリするために使用されるORMです。 GraphQLエコシステムのすべてのツールやライブラリと完璧に連携します。GraphQLとPrismaの詳細はこちら。

Prismaスキーマ

Prismaスキーマは、Prismaのモデリング言語を使用してデータベーススキーマを定義します。データモデリングを容易かつ直感的にし、特に関係性のモデリングに役立ちます。

Prisma ORMの利用をさらに強化するために、追加のツールもご利用いただけます
Prisma Accelerateは、データベースクエリを高速化するグローバルデータベースキャッシュおよびスケーラブルな接続プールです。
Prisma Pulseを使用すると、タイプセーフな方法でリアクティブなリアルタイムアプリケーションを構築できます。PulseはGraphQLサブスクリプションまたはライブクエリを実装するのに最適なコンパニオンです。

1// Define the `User` table in the database
2model User {
3 id String @id @default(cuid())
4 email String @unique
5 password String
6 name String?
7 posts Post[]
8}
9
10// Define the `Post` table in the database
11model Post {
12 id String @id @default(cuid())
13 title String
14 content String?
15 authorId String
16 author User
17}

PrismaとApolloのユースケース

Prismaは、Apollo ServerのGraphQLリゾルバーで使用して、データベース内のデータを読み書きすることにより、GraphQLクエリとミューテーションを実装できます。

ApolloネイティブのSDL-firstアプローチ、またはNexusやTypeGraphQLなどのライブラリによって提供されるコードファーストアプローチと互換性があります。

Apollo Server (SDL-first)

Apollo Server — SDL-First

GraphQLスキーマを構築するためにApolloネイティブのSDL-firstアプローチを使用する場合、GraphQLスキーマ定義を文字列として、およびこの定義を実装するリゾルバーマップを提供します。リゾルバー内では、Prisma Clientを使用してデータベース内のデータを読み書きし、受信GraphQLクエリとミューテーションを解決できます。

1import { PrismaClient } from '@prisma/client';
2import { ApolloServer } from 'apollo-server'
3
4const prisma = new PrismaClient();
5
6const typeDefs = `
7 type User {
8 email: String!
9 name: String
10 }
11
12 type Query {
13 allUsers: [User!]!
14 }
15`;
16
17const resolvers = {
18 Query: {
19 allUsers: () => {
20 return prisma.user.findMany();
21 }
22 }
23};
24
25const server = new ApolloServer({ resolvers, typeDefs });
26server.listen({ port: 4000 });
Nexus (コードファースト)
TypeGraphQL (コードファースト)

Apollo Server — SDL-First

GraphQLスキーマを構築するためにApolloネイティブのSDL-firstアプローチを使用する場合、GraphQLスキーマ定義を文字列として、およびこの定義を実装するリゾルバーマップを提供します。リゾルバー内では、Prisma Clientを使用してデータベース内のデータを読み書きし、受信GraphQLクエリとミューテーションを解決できます。

1import { PrismaClient } from '@prisma/client';
2import { ApolloServer } from 'apollo-server'
3
4const prisma = new PrismaClient();
5
6const typeDefs = `
7 type User {
8 email: String!
9 name: String
10 }
11
12 type Query {
13 allUsers: [User!]!
14 }
15`;
16
17const resolvers = {
18 Query: {
19 allUsers: () => {
20 return prisma.user.findMany();
21 }
22 }
23};
24
25const server = new ApolloServer({ resolvers, typeDefs });
26server.listen({ port: 4000 });

"「Prismaは、データベースを定義するための優れたモデリング言語と、JavaScriptとTypeScriptでSQLを操作するための強力なORMを提供します。Apollo Serverに最適な組み合わせであり、データベースを使用したGraphQL APIの構築を楽しいものにします。」"

Kurt Kemple Kurt Kemple -
DevRelマネージャー of Apollo

なぜPrismaとApolloを選ぶのか?

エンドツーエンドのタイプ安全性

データベースからフロントエンドまで、アプリケーション全体で一貫した型定義を取得し、生産性を向上させ、エラーを回避します。

最適化されたデータベースクエリ

Prismaの組み込みデータローダーは、N+1クエリの場合でも、最適化されパフォーマンスの高いデータベースクエリを保証します。

タイプセーフなデータベースクライアント

Prisma Clientは、JavaScriptでもオートコンプリートなどの利点がある、完全にタイプセーフなデータベースクエリを保証します。

直感的なデータモデリング

Prismaのモデリング言語はGraphQL SDLに触発されており、データベーススキーマを直感的に記述できます。

簡単なデータベース移行

Prismaスキーマをデータベースにマッピングすることで、データベーススキーマを管理するためにSQLを記述する必要がなくなります。

フィルター、ページネーション、および順序付け

Prisma Clientは、一般的なデータベース機能のための便利なAPIを提供することで、ボイラープレートを削減します。

注目のPrisma & Apolloの例

GraphQL APIの構築とデプロイ方法

Apollo ServerとPrismaを使用してGraphQL APIを構築し、DigitalOceanのApp Platformにデプロイする方法を説明する包括的なチュートリアル。

SDL-firstスターターキット

SDL-firstスキーマとSQLiteデータベースを備えた、すぐに実行できるサンプルプロジェクト

Nexusスターターキット

Nexus(コードファースト)とSQLiteデータベースを備えた、すぐに実行できるサンプルプロジェクト