前回は、Prisma を使って、PostgresSQL データベースと接続しました。
今回は、Prisma を使って、PostgresSQL データを取得します。
コードは、前回のコードを使用します。

【GraphQL】Prismaを使って、PostgresSQLデータベースと接続する
 
スキーマを指定する
prisma フォルダの schema.prisma ファイルに、スキーマを指定します。
まず、Books という model を作成します。
id を作成します。
id の型を指定します。
id の型は整数にしたいので、Intを指定します。
prisma で ID を認識するために、@id を指定します。
毎回 ID を指定したくないので、自動で取得できる様にするために、autoincrement を設定します。
model Book {
  id Int @id @default(autoincrement())
}
 
title、author、categoryId を指定します。
また、インデントを揃えると、見やすくなります。
model Book {
  id         Int    @id @default(autoincrement())
  title      String
  author     String
  categoryId Int
}
 
isRead は、デフォルトでfalseを指定します。
model Book {
  id         Int     @id @default(autoincrement())
  title      String
  author     String
  categoryId Int
  isRead     Boolean @default(false)
}
 
作成日を作成します。
作成日は、デフォルトで、now を指定します。
model Book {
  id         Int      @id @default(autoincrement())
  title      String
  author     String
  categoryId Int
  isRead     Boolean  @default(false)
  createdAt  DateTime @default(now())
}
 
Book と同様に、Category も作成します。
model Category {
  id        Int
  name      String
}
 
では、一度テーブルを作成します。
テーブルを作成するには、ターミナルでnpx prisma db pushを実行します。

テーブルが作成されました。
作成されたかどうかを確認します。
ターミナルで、npx prisma studioを実行します。

自動で、ブラウザが開きました。
Book をクリックしてみると、

先ほど作成したテーブル名が表示されました。
リレーションシップを作成する
次は、Book と Category の関係を確立します。
Book の categoryId と Category の id を紐付けます。
Book の categoryId の下に category を設定しましょう。
model Book {
  id         Int      @id @default(autoincrement())
  title      String
  author     String
  isRead     Boolean  @default(false)
  createdAt  DateTime @default(now())
  categoryId Int
  category
}
 
category の中身は、Categoryなので、型はCategoryを指定します。
model Book {
  id         Int      @id @default(autoincrement())
  title      String
  author     String
  isRead     Boolean  @default(false)
  createdAt  DateTime @default(now())
  categoryId Int
  category   Category
}
 
relationを使って紐付けます。
Book の対象は、categoryIdなので、fieldsにcategoryIdを指定します。
Category の対象は、idなので、referencesにidを指定します。
model Book {
  id         Int      @id @default(autoincrement())
  title      String
  author     String
  isRead     Boolean  @default(false)
  createdAt  DateTime @default(now())
  categoryId Int
  category   Category @relation(fields: [categoryId], references: [id])
}
 
Category では、booksを設定します。
booksには、Book[]を指定します。
model Category {
  id         Int      @id @default(autoincrement())
  name       String
  books      Book[]
}
 
では、再度ブラウザで確認します。
prisma studio を解除して、ターミナルでnpx prisma db pushを実行します。
npx prisma studioを実行します。

Book に category が追加されました。

Category にも books が追加されています。
Book と Category にデータを入れてみます。


Book と Category の関係は、問題なく確立されています。
Postgres のデータを GraphQL で取得する
最後に、Postgres のデータを GraphQL で取得します。
まずは、index.ts で、PrismaClientとPrismaをインポートします。
ts
import { PrismaClient, Prisma } from "@prisma/client";
 
Postgres のデータベースを接続するために、PrismaClient を呼び出します。
ts
const prisma = new PrismaClient();
 
server内のdbをprismaに置き換えます。
ts
const server = new ApolloServer({
  typeDefs,
  resolvers: {
    Query,
    Mutation,
    Category,
    Book,
  },
  context: {
    prisma,
  },
});
 
context の型を作成しておきます。
ts
export type Context = {
  prisma: PrismaClient<
    Prisma.PrismaClientOptions,
    never,
    Prisma.RejectOnNotFound | Prisma.RejectPerOperation
  >;
};
 
次に、shema.ts のスキーマを、schema.prisma で作成した型に合わせます。
ts
const { gql } = require("apollo-server");
export const typeDefs = gql`
  type Query {
    books(filter: BooksInput): [Book!]!
    book(id: Int!): Book
    categories: [Category!]!
    category(id: ID!): Category
  }
  type Mutation {
    addBook(input: AddBookInput!): Book!
    deleteBook(id: Int!): Boolean!
    updateBook(id: Int!, input: UpdateBookInput!): Book!
  }
  type Book {
    id: Int!
    title: String!
    author: String!
    createdAt: String!
    category: Category!
  }
  type Category {
    id: Int!
    name: String!
    books: [Book!]!
  }
  input BooksInput {
    isRead: Boolean
  }
  input AddBookInput {
    id: Int!
    title: String!
    author: String!
    categoryId: Int!
    isRead: Boolean!
  }
  input UpdateBookInput {
    id: Int
    title: String
    author: String
    categoryId: Int
    isRead: Boolean
  }
`;
 
resolvers フォルダの Query.ts を開きます。
books 内のdbを prisma へ変換します。
また、parent と filter は、取り敢えず『_』にしておきましょう。
ts
books: (_, _, { prisma }) => {
  let filteredBooks = db.books;
  if (filter) {
    if (filter.isRead === true) {
      filteredBooks = filteredBooks.filter((book) => {
        return book.isRead;
      });
    }
  }
  return filteredBooks;
},
 
prisma に型指定をします。
型は、先ほど作成した Context を使用します。
ts
books: (_: any, __: any, { prisma }: Context) => {
  let filteredBooks = db.books;
  if (filter) {
    if (filter.isRead === true) {
      filteredBooks = filteredBooks.filter((book) => {
        return book.isRead;
      });
    }
  }
  return filteredBooks;
},
 
prisma の findMany を使って、一覧を取得します。
ts
books: (_: any, __: any, { prisma }: Context) => {
  return prisma.book.findMany();
},
 
では、GraphQL のサーバーを起動して、ブラウザで確認します。

『addBooks』をクリックすると、

Postgres のデータを取得することができました。
以下が、全文です。
次回は、リゾルバ内を整形して、特定の PostgresSQL データを取得します

【GraphQL】Prismaを使って、特定のPostgresSQLデータを取得する