6

100 以上のデータを取得するために、github grpahQL API で endCursor と hasNextPage を使用してページネーションを行うのにうんざりしています。私が使用したクエリは次のとおりです。

query {
      organization(login:"XXX") {
                   repository(name:"XX") {
                   pullRequests(first:100, states:[OPEN], after: "XXX" ) {
        pageInfo{
          hasNextPage
          endCursor
        }
      }
    }

それは働いています。ただし、さらに詳細にアクセスするには、反復的なページネーションを行う必要があります。GraphQL APIですべてのページをプログラムでトラバースする効率的な代替手段を誰かが提供できますか?

4

2 に答える 2

1

Simon Willison の ' Paginating through the GitHub GraphQL API with Python ' からインスピレーションを得て、クエリのページネーションのために私が行ってきたことを以下に示します。

query {
  node(id: "PROJECT_ID") {
    ... on ProjectNext {
      items(first: 100 after: CURSOR) {
        pageInfo {
          hasNextPage
          endCursor
        }
        nodes {
          title
          fieldValues(first: 8) {
            nodes {
              value
            }
          }
          content {
            ... on Issue {
              number
              labels(first: 50) {
                nodes {
                  name
}}}}}}}}}

私の Python コードではPROJECT_ID、参照しているプロジェクト ID に設定された変数を使用しています。

カーソルafter: CURSORが最初に置き換えられ""、次に設定した次のページに置き換えられますcursor = 'after:\\"' + response["data"]["node"]["items"]["pageInfo"]["endCursor"] + '\\"'

私の完全なコードは、私の dump_cards ユーティリティのatdumpmemexモジュールにあります。

ここで重要なのはpageInfo、他の関連するノードとうまくやっていくことです。次に、次の反復のクエリにフィードできるように、true になるendCursorたびに取得します。hasNextPage

pageInfo は次のようになります。

"pageInfo": {
  "hasNextPage": false,
  "endCursor": "Y3Vyc29yOnYyOpHOAAhOsg=="
}

現時点でendCursorは base64 でエンコードさcursor:v2:XYZれていますが、GitHub が他の ID を base64 エンコードから他のスキームに移動したため、これに依存しないでください。

于 2021-11-19T18:42:20.247 に答える