【GraphQL】Prismaを使って、PostgresSQLデータを追加・削除・更新をする
GraphQL

【GraphQL】Prismaを使って、PostgresSQLデータを追加・削除・更新をする

作成日:2021年11月22日
更新日:2021年11月25日

前回は、Prisma を使って、特定の PostgresSQL データを取得しました。

graphql-prisma-postgres-unique

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

今回は、PostgresSQL データを追加や削除、更新します。

コードは、前回のコードを使用します。

PostgresSQL データを追加する

まずは、スキーマを修正します。

schema.ts のtypeDefsにある、AddBookInputを修正します。

ts
input AddBookInput {
title: String!
author: String!
categoryId: Int!
isRead: Boolean!
}

エラーメッセージを提供するための型を作成します。

ts
type Error {
message: String!
}

addbookの型にErrorの型を含めたいので、新たに型を作成します。

ts
type BookPayload {
errors: [Error!]!,
book: Book
}

Mutationaddbookを修正します。

型は、先程作成した、BookPayloadにしましょう。

ts
type Mutation {
addBook(input: AddBookInput!): BookPayload!
deleteBook(id: Int!): Boolean!
updateBook(id: Int!, input: UpdateBookInput!): Book!
}

スキーマが完成したので、次はリゾルバーを修正します。

resolvers フォルダの Mutation.ts を開きます。

Mutation の addBook のdbprismaに変更します。

また、input の id は自動で作成されるので、削除します。

ts
addBook: async (_: any, { input }: any, { prisma }: Context) => {
const { title, author, categoryId, isRead } = input;
};

入力データがない場合、エラーメッセージを提供するようにします。

また、book は、null を返すようにします。

ts
addBook: async (_: any, { input }: any, { prisma }: Context) => {
const { title, author, categoryId, isRead } = input;
if (!title || !author || !categoryId || !isRead) {
return {
errors: [
{
message: "本の内容を入力してください",
},
],
book: null,
};
}
};

book のデータを作成するための変数を設定します。

prisma でデータを作成するには、create を使います。

ts
addBook: async (_: any, { input }: any, { prisma }: Context) => {
const { title, author, categoryId, isRead } = input;
if (!title || !author || !categoryId || !isRead) {
return {
errors: [
{
message: "本の内容を入力してください",
},
],
book: null,
};
}
const newBook = await prisma.book.create({
data: {
title,
author,
categoryId,
isRead,
},
});
};

errorsbookを返します。

ts
addBook: async (
_: any,
{ input }: any,
{ prisma }: Context
) => {
const { title, author, categoryId, isRead } = input;
if(!title || !author || !categoryId || !isRead) {
return {
errors: [{
message: "本の内容を入力してください"
}],
book: null
}
}
const newBook = await prisma.book.create({
data: {
title,
author,
categoryId,
isRead,
},
});
return {
errors: [],
book: newBook
}
},

addBookinputの型を作成します。

ts
type MutationBook = {
input: {
title: string;
author: string;
categoryId: number;
isRead: boolean;
};
};
type BookPayload = {
errors: {
message: string;
}[];
book: Book | null;
};
ts
addBook: async (
_: any,
{ input }: MutationBook,
{ prisma }: Context
): Promise<BookPayload> => {
const { title, author, categoryId, isRead } = input;
if(!title || !author || !categoryId || !isRead) {
return {
errors: [{
message: "本の内容を入力してください"
}],
book: null
}
}
const newBook = await prisma.book.create({
data: {
title,
author,
categoryId,
isRead,
},
});
return {
errors: [],
book: newBook
}
},

リゾルバーが完成したので、GraphQL でデータを作成してみます。

AddBook のmutationは、errorsbookを指定します。

graphql
mutation AddBook($input: AddBookInput!) {
addBook(input: $input) {
errors {
message
}
book {
title
author
}
}
}

Variables にデータを作成します。

image2

AddBook ボタンをクリックすると、

image3

book が追加されました。

Prisma Studio で確認します。

image4

無事、データが追加されました。

エラーメッセージも表示されるか確認します。

試しに、titleを空白にすると、

image5

image6

エラーメッセージが表示されました。

PostgresSQL データを削除する

データを削除するため、スキーマを修正します。

schema.ts のMutationdeleteBookの型をBookPayloadへ修正します。

ts
type Mutation {
addBook(input: AddBookInput!): BookPayload!
deleteBook(id: Int!): BookPayload!
updateBook(id: Int!, input: UpdateBookInput!): Book!
}

次は、リゾルバーを修正します。

resolvers フォルダの Mutation.ts を開きます。

addBook と同様に、deleteBook の型を指定します。

ts
deleteBook: async (_:any, { id }: {id: number}, { prisma }: Context): Promise<BookPayload> => {
},

特定の id の book データがあるか確認し、本がなければエラーメッセージを表示するようにします。

まずは、prisma のfindUniqueを使って、特定の id の book データを指定します。

ts
deleteBook: async (_:any, { id }: {id: number}, { prisma }: Context): Promise<BookPayload> => {
const book = await prisma.book.findUnique({
where: {
id,
},
})
},

addBookのコードを参考にして、bookがなければ、『本のデータがありません』と表示するようにし、null を返します。

ts
deleteBook: async (_:any, { id }: {id: number}, { prisma }: Context): Promise<BookPayload> => {
const book = await prisma.book.findUnique({
where: {
id,
},
})
if (!book) {
return {
errors: [
{
message: "本のデータがありません",
}
],
book: null,
}
}
},

prisma で、特定のデータを削除する場合、deleteを使用します。

ts
deleteBook: async (_:any, { id }: {id: number}, { prisma }: Context): Promise<BookPayload> => {
const book = await prisma.book.findUnique({
where: {
id,
},
})
if (!book) {
return {
errors: [
{
message: "本のデータがありません",
}
],
book: null,
}
}
await prisma.book.delete({
where: {
id
}
});
},

errorsbookを返します。

ts
deleteBook: async (_:any, { id }: {id: number}, { prisma }: Context): Promise<BookPayload> => {
const book = await prisma.book.findUnique({
where: {
id,
},
})
if (!book) {
return {
errors: [
{
message: "本のデータがありません",
}
],
book: null,
}
}
await prisma.book.delete({
where: {
id
}
});
return {
errors: [],
book,
}
},

リゾルバーが完成したので、GraphQL で削除してみましょう。

mutationを作成します。

graphql
mutation DeleteBook($deleteBookId: Int!) {
deleteBook(id: $deleteBookId) {
errors {
message
}
book {
title
}
}
}

id が『4』のデータを削除します。

image7

DeleteBook のボタンをクリックすると、

image8

deleteBookの結果にbookデータが表示されました。

Prisma Studio で確認します。

Prisma Studio をリロードすると、

image9

id が 4 のデータを削除したので、存在していません。

エラーメッセージが正常に表示されるか、確認しましょう。

id が『8』のデータを削除してみます。

image10

エラーメッセージが返ってきました。

PostgresSQL データを更新する

最後に、データの更新を修正します。

まずは、スキーマから修正します。

schema.ts のMutationにあるupdateBookの型をBookPayloadへ変更します。

また、UpdateBookInputidは、必要ないので削除しておきましょう。

ts
type Mutation {
addBook(input: AddBookInput!): BookPayload!
deleteBook(id: Int!): BookPayload!
updateBook(id: Int!, input: UpdateBookInput!): BookPayload!
}
ts
input UpdateBookInput {
title: String
author: String
categoryId: Int
isRead: Boolean
}

次にリゾルバーを修正します。

resolvers フォルダの Mutation.ts を開きます。

updateBook に型を追加します。

ts
updateBook: async (
_: any,
{ id, input }: { id: number, input: MutationBook["input"] },
{ prisma }: Context
): Promise<BookPayload> => {
},

deleteBook を参考に、データがない場合、エラーメッセージを表示するようにします。

ts
updateBook: async (
_: any,
{ id, input }: { id: number, input: MutationBook["input"] },
{ prisma }: Context
): Promise<BookPayload> => {
const { title, author, categoryId, isRead } = input;
const book = await prisma.book.findUnique({
where: {
id,
},
});
if (!book) {
return {
errors: [
{
message: "本のデータがありません",
},
],
book: null,
};
}
},

prisma で単一データを更新するには、updateを使います。

更新する内容は、inputで、対象は、指定したidになります。

ts
updateBook: async (
_: any,
{ id, input }: { id: number, input: MutationBook["input"] },
{ prisma }: Context
): Promise<BookPayload> => {
const { title, author, categoryId, isRead } = input;
const book = await prisma.book.findUnique({
where: {
id,
},
});
if (!book) {
return {
errors: [
{
message: "本のデータがありません",
},
],
book: null,
};
}
const updateBooks = await prisma.book.update({
data: {
...input
},
where: {
id
}
});
},

errorsbookを返します。

ts
updateBook: async (
_: any,
{ id, input }: { id: number, input: MutationBook["input"] },
{ prisma }: Context
): Promise<BookPayload> => {
const { title, author, categoryId, isRead } = input;
const book = await prisma.book.findUnique({
where: {
id,
},
});
if (!book) {
return {
errors: [
{
message: "本のデータがありません",
},
],
book: null,
};
}
const updateBooks = await prisma.book.update({
data: {
...input
},
where: {
id
}
});
return {
errors: [],
book: updateBooks,
};
},

リゾルバーが完成したので、GraphQL で確認します。

GraphQL でmutationを作成します。

graphql
mutation UpdateBook($updateBookId: Int!, $input: UpdateBookInput!) {
updateBook(id: $updateBookId, input: $input) {
errors {
message
}
book {
title
author
}
}
}

Variables を作成します。

image11

UpdateBook をクリックすると、

image12

指定したデータが更新されました。

Prisma Studio で確認します。

image13

正常にデータが更新されました。

エラーメッセージも確認しましょう。

image14

UpdateBook をクリックすると、

image15

『本のデータがありません』と出力されました。

コードの全文は、以下の通りです。

次回は、ユーザー登録します。

graphql-prisma-signup

【GraphQL】Prismaを使って、ユーザー登録をする

© 2024あずきぱんウェブスタジオ