GraphQL PR

【GraphQL】StrawberryでGraphQLに入門「Getting started編」

【GraphQL】StrawberryでGraphQLに入門「Getting started編」
記事内に商品プロモーションを含む場合があります

こんにちは!٩( ‘ω’ )و

都内の受託中心に開発を行なっている企業で、Webエンジニアをしているモリヤス(@_moriyas)です!

サーバー側の開発で、PythonとStrawberryでGraghQLを使うことになったので、公式サイトを使って入門していきたいと思います!

A modern GraphQL library for Python | 🍓 Strawberry GraphQL

今回の記事では公式サイトのGetting started(Getting started with Strawberry | 🍓 Strawberry GraphQL)をやっていきたいと思います!

なお記事の内容は下記に注意してご覧くださいm(_ _)m

  • 主にGoogle翻訳を使い翻訳し、僕自身の解釈や理解を伝えるものになります。
  • わかりやすくするために、翻訳通りの説明になっていない部分や、僕自身が調べて追加説明してある部分があります。
  • 公式に書かれていることを全て書いていませんし、公式の見解通りに書いてるつもりですが、一致しているとは限りません。

※何か間違いなどあれば、教えていただけると幸いですm(_ _)m

環境・バージョン

  • Python 3.11(公式サイトではPython 3.8以上という説明がされています)
  • Mac
  • VSCode

※このチュートリアルではPythonについてとコマンドラインがそれなりにわかっているという前提で進めていきます。

プロジェクトの作成とStrawberryのインストール

デスクトップにフォルダを作って進めていきます。

Terminal
$ cd ~/Desktop
$ mkdir strawberry-demo
$ cd strawberry-demo
$ code .

ここからはVSCodeを開いて作業を進めていきます。

まず、下記コマンドでvirtualenvという名前仮想環境を作成します。(公式のチュートリアルではpythonというコマンドを使っておりますが、僕のPCにデフォルトでpython3がインストールされていたので、python3というコマンドを使っております!)

Terminal
$ python3 -m venv virtualenv

続いて下記コマンドで仮想環境を起動させて、その中でStrawberryとデバッグサーバーをインストールします。

Terminal
$ source virtualenv/bin/activate
(virtualenv) $ pip install 'strawberry-graphql[debug-server]'

このセクションで扱った、venvや仮想環境については下記の記事がわかりやすかったので、ご覧ください!

venvの使い方 | エンベーダー

スキーマの定義

重要

GraphQLサーバーではスキーマを書くことで、クライアントから問い合わせることができるデータの構造を定義します。

下記のようなschema.pyを作成します。

schema.py
import typing
import strawberry
 
 
@strawberry.type
class Book:
    title: str
    author: str
 
 
@strawberry.type
class Query:
    books: typing.List[Book]

上記のように書くことでスキーマを定義できます。

これでクライアントから、「0冊以上のBookのリストを返すbooksという名前のクエリ」を実行できるようになります。

データの定義

上記まででスキーマの構造がわかるようになったので、データを定義できます。

StrawberryではDBやREST API、ファイルなどあらゆるデータソースを使えるようです。

ここでは、下記の5~11行目のようにハードコーディングをしてデータを用意します。

schema.py
import typing
import strawberry
 
 
def get_books():
    return [
        Book(
            title="The Great Gatsby",
            author="F. Scott Fitzgerald"
        ),
    ]
 
 
@strawberry.type
class Book:
    title: str
    author: str
 
 
@strawberry.type
class Query:
    books: typing.List[Book]

resolverの定義

resolverを定義します。

resolverとは?

サーバーからどのようなデータを取得できるかを定義するもの

下記のようにQueryを更新します。

schema.py
@strawberry.type
class Query:
    books: typing.List[Book] = strawberry.field(resolver=get_books)

strawberry.fieldを使用するとresolverの指定ができます。(ここではget_booksをresolverとして指定している)

スキーマを作成して実行する

ここまでで、スキーマとデータの定義を行ってきたので、それを元にGraphQLスキーマを作成し、サーバーを起動します。

下記の24行目のようにコードを追加します。

schema.py
import typing
import strawberry


def get_books():
    return [
        Book(
            title="The Great Gatsby",
            author="F. Scott Fitzgerald"
        ),
    ]

@strawberry.type
class Book:
    title: str
    author: str


@strawberry.type
class Query:
    books: typing.List[Book] = strawberry.field(resolver=get_books)


schema = strawberry.Schema(query=Query)

次に、ターミナルで下記コマンドを実行します。

Terminal
(virtualenv) $ strawberry server schema
Running strawberry on http://0.0.0.0:8000/graphql 🍓

上記のような表示がされていれば、デバッグサーバーが起動されています。

クエリの実行

GraphQLクエリの実行をしてみます。

StrawberryにはGraphiQLと呼ばれるツールが付いており、「http://0.0.0.0:8000/graphql」を開くと下記のような画面が表示されるかと思います。

上記画面の説明を簡単にすると

  • 赤枠:実行するクエリを記述する場所
  • 緑枠:記述したクエリを実行するボタン
  • 青枠:クエリの実行結果を表示する場所

という感じです。

では、下記を上の画像の赤枠内に貼り付けて、booksクエリを実行してみます。

{
  books {
    title
    author
  }
}

下の画像のように実行結果に先ほどget_books()関数で定義した戻り値が表示されていればOKです。

少し変えてみる!

上記まででチュートリアル自体は終わりですが、少しコードに変更に加えてGraphQLの雰囲気を確認してみます!

下記のようにshcema.pyに変更を加えます。

schema.py
import typing
import strawberry


def get_book_title():
    return BookTitle(
        title="The Great Gatsby",
    )


def get_books():
    return [
        Book(
            title="The Great Gatsby 1",
            author="F. Scott Fitzgerald 1"
        ),
        Book(
            title="The Great Gatsby 2",
            author="F. Scott Fitzgerald 2"
        ),
        Book(
            title="The Great Gatsby 3",
            author="F. Scott Fitzgerald 3"
        ),
    ]


@strawberry.type
class BookTitle:
    title: str

@strawberry.type
class Book:
    title: str
    author: str


@strawberry.type
class Query:
    book_title: BookTitle = strawberry.field(resolver=get_book_title)
    books: typing.List[Book] = strawberry.field(resolver=get_books)


schema = strawberry.Schema(query=Query)

まずはbook_titleというクエリを実行してみます!

続いてbooksクエリを実行してみます!

終わりに

これでGraghQLに入門完了d( ̄  ̄)