3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GraphQL

Last updated at Posted at 2022-01-28

Learning GraphQL (初めての GraphQL) という本と https://graphql.org/learn/ を読んで勉強したメモです。

便利なツール:

上記 SWAPI GraphiQL の左の欄に GraphQL のクエリを入れて実行すると結果が出る。

query {
  person(personID:5) {
    name
    birthYear
    created
  }
}
{
  "data": {
    "person": {
      "name": "Leia Organa",
      "birthYear": "19BBY",
      "created": "2014-12-10T15:20:09.791000Z"
    }
  }
}

これで personID:5 の name, birthYear, created という属性(field)を取得するという意味らしい。クエリの形を Schema と呼ぶ。GraphiQL 画面の右上の Docs を押すと Schema を探せる。上記の Schema を探してみる。

まず以下が見つかる。

query: Root

これはこの GraphQL が Root を検索出来る事を示す。Root というのはトップレベルの型で、この下に検索可能な属性が定義されるので Root を選択すると以下が見つかる。

person(id: ID, personID: ID): Person
  • person: 属性(field) の名前。
  • (id: ID, personID: ID): 引数。この属性 person で id と personID という引数が使える事を現す。
  • Person: この属性 person が答える型。

さらに Person を選択すると Person の属性の説明が現れる。

    name: String ... 説明 ...
    birthYear: String ... 説明 ...
    eyeColor: String ... 説明 ...

これをもとに上記のクエリを解釈すると、person 属性を引数 personID:5 と共に検索し、答えには name, birthYear, created の3つを要求するという意味になる。ちなみに query は省略出来るので以下のようにしても同じ。

ぱっと見 person は関数で、name は変数みたいに別のものに見えるが、name は引数が無いだけでどちらも同じ属性 (field) というもの。

{
  person(personID:5) {
    name
    birthYear
    created
  }
}

クエリに Operation name を付ける事も出来る。これは multi-operation documents というのを使う時だけ必須で省略可能。

query NumberFive {
  person(personID:5) {
    name
    birthYear
    created
  }
}

クエリは JSON っぽくて JSON じゃないのが気持ち悪いが、JSON の属性だけ抜き出しオプションで引数を付けた物と考えれば良い。例えば

{
  person(personID:11) {
    name
    filmConnection {
      films {
        title
      }
    }
  }
}

は以下を返す。クエリにコンマが無いのと films が List 型である事を表現していないのが非常に気持ち悪い。これではクエリだけを見て返って来るデータの構造を判断出来ないのではないかという疑問を抱き気持ち悪い。まあだいたいクエリと結果は同じ構造をしている。

{
  "data": {
    "person": {
      "name": "Anakin Skywalker",
      "filmConnection": {
        "films": [
          {
            "title": "The Phantom Menace"
          },
          {
            "title": "Attack of the Clones"
          },
          {
            "title": "Revenge of the Sith"
          }
        ]
      }
    }
  }
}

パラメータをクエリに渡したいときは Variable を使う。ただクエリの中に変数名を埋め込むだけでは駄目で、query の後にカッコを書いてパラメータ名と型を宣言する。この場合 query キーワードは省略できない。Operation name は省略できる。

query ($numPeople: Int) {
  allPeople(first:$numPeople) {
  	people {
  	  name
  	}
	}
}

GraphiQL で変数を使う時は右下の QUERY VARIABLES の部分に入力する。

{"numPeople":3}

結果

{
  "data": {
    "allPeople": {
      "people": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "C-3PO"
        },
        {
          "name": "R2-D2"
        }
      ]
    }
  }
}

GraphQL でもデータの更新が出来る。データの更新には query の代わりに mutation というキーワードを使う。実際には query の実装で更新しようと思えば出来が、規約で更新には mutation を使いましょうという事になっているらしい。以下架空のクエリ。

mutation {
  setPerson(personID:5 gender:"male") {
    name
    gender
  }
}
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?