こんにちは。KOUKIです。
GraphQLの実装の続きです。前回は、Queryの簡単な使い方について触れました。
今回は、Mutationについて学びます。
記事まとめ
Create Mutation
Mutationは、データの作成、更新、削除などの機能を担うGraphQLの機能です。
ちなみにQueryは、データ検索の役割を担っていました。
最初にデータ作成のMutatoinを実装しましょう。
app/api/schema.pyに次の実装を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# app/api/schema.py ... class BookCreateMutation(graphene.Mutation): class Arguments: title = graphene.String(required=True) publish = graphene.Int() book = graphene.Field(BookType) def mutate(self, info, title, publish): book = Book.objects.create(title=title, publish=publish) return BookCreateMutation(book=book) class Mutation: create_book = BookCreateMutation.Field() |
続いて、Mutationをプロジェクト配下のschema.pyに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# app/schema.py import graphene import app.api.schema class Query(app.api.schema.Query, graphene.ObjectType): pass class Mutation(app.api.schema.Mutation, graphene.ObjectType): pass schema = graphene.Schema(query=Query, mutation=Mutation) |
ブラウザをリロードして次のMuataionを実行してください。
1 2 3 4 5 6 7 8 9 |
mutation Createbook { createBook(title:"Harry Potter and the Order of the Phoenix", publish: 2001) { book { id title publish } } } |
1 2 3 4 5 6 7 8 9 10 11 |
{ "data": { "createBook": { "book": { "id": "5", "title": "Harry Potter and the Order of the Phoenix", "publish": 2001 } } } } |
Update Mutation
Update Mutationは、データ更新の役割を担います。
先ほど追加したデータのpublish(2001)に誤りがありましたので、更新処理を追加して解決します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# app/api/schema.py class BookUpdateMutation(graphene.Mutation): class Arguments: title = graphene.String() publish = graphene.Int() id = graphene.ID(required=True) book = graphene.Field(BookType) def mutate(self, info, id, title, publish): book = Book.objects.get(pk=id) if title is not None: book.title = title if publish is not None: book.publish = publish book.save() return BookUpdateMutation(book=book) class Mutation: create_book = BookCreateMutation.Field() update_book = BookUpdateMutation.Field() # new |
画面をリロードして、次のMutationを実行します。
1 2 3 4 5 6 7 8 9 |
mutation UpdateBook { updateBook(id: 5, title:"Harry Potter and the Order of the Phoenix", publish: 2003) { book { id title publish } } } |
1 2 3 4 5 6 7 8 9 10 11 |
{ "data": { "updateBook": { "book": { "id": "5", "title": "Harry Potter and the Order of the Phoenix", "publish": 2003 } } } } |
Delete Mutation
最後にDelete Mutationにて、データの削除処理を実装してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# app/api/schema.py class BookDeleteMutation(graphene.Mutation): class Arguments: id = graphene.ID(required=True) book = graphene.Field(BookType) def mutate(self, info, id): book = Book.objects.get(pk=id) book.delete() return BookDeleteMutation(book=None) class Mutation: create_book = BookCreateMutation.Field() update_book = BookUpdateMutation.Field() # new delete_book = BookDeleteMutation.Field() |
書き忘れていましたが、GraphQLにはScalar typesというプリミティブ型に似たtypeを持っています。
具体的には、Int, Float, String, Boolean, IDの5つです。
「class Arguments」に設定しているtypeは、この型を指定しています。
それでは、ブラウザをリロードして次のMutationを実行しましょう。
1 2 3 4 5 6 7 |
mutation DeleteBook { deleteBook(id: 5) { book { id } } } |
削除した場合、Nullを返すようにしたので、次の結果が表示されるはずです。
1 2 3 4 5 6 7 |
{ "data": { "deleteBook": { "book": null } } } |
データが消えているか確認するため、クエリを発行します。
1 2 3 4 5 |
query { book(id: 5) { id } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "errors": [ { "message": "Book matching query does not exist.", "locations": [ { "line": 2, "column": 3 } ], "path": [ "book" ] } ], "data": { "book": null } } |
“Book matching query does not exist.“となったため、データが消えていることが確認できました。
次回
次回は、JWTを使った認証機能の作成に取り組みます。
コメントを残す
コメントを投稿するにはログインしてください。