Udostępnij przez


Wybór pola (projekcja) w narzędziu GraphQL

W narzędziu GraphQL żądane pola definiują dokładnie to, co konstruktor interfejsu API danych (DAB) zwraca, a nie mniej. Język DAB kompiluje te wybory w sparametryzowanym języku SQL, w tym tylko zamapowane (uwidocznione) kolumny, których zażądano, i wszelkie dodatkowe kolumny, które muszą pobrać wewnętrznie. Mogą to być kolumny wymagane w przypadku relacji (kluczy obcych), kluczy podstawowych lub stabilnego porządkowania używanego w konstrukcji stronicowania i kursora.

Uwaga / Notatka

Narzędzie GraphQL nie ma symbolu wieloznakowego, takiego jak SELECT *. Klienci muszą jawnie określić każde pole.

Przejdź do wersji REST tego dokumentu.

Wybór podstawowy

Wykonywanie zapytań dotyczących kilku zamapowanych pól.

Zapytanie GraphQL

query {
  books {
    items {
      id
      title
      price
    }
  }
}

Koncepcyjny język SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

Przykładowa odpowiedź

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "price": 20
        }
      ]
    }
  }
}

Aliasy pól

Aliasy zmieniają nazwy pól w odpowiedzi, a nie w bazie danych. Warstwa SQL nie aliasuje nazw pól GraphQL; aliasowanie odbywa się po pobraniu danych.

query {
  books {
    items {
      id
      bookTitle: title
      cost: price
    }
  }
}

Koncepcyjny język SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

Przykładowa odpowiedź

Z aliasami:

{
  "data": {
    "books": {
      "items": [
        {
          "id": 2,
          "bookTitle": "Foundation",
          "cost": 18
        }
      ]
    }
  }
}

Zagnieżdżone zaznaczenie

Relacje zdefiniowane w konfiguracji umożliwiają zagnieżdżone zapytania. Poniższy koncepcyjny kod SQL przedstawia pojedyncze sprzężenia. W praktyce daB może wykonywać jedno lub więcej sparametryzowanych zapytań (na przykład zapytanie nadrzędne i pobieranie podrzędne wsadowe) zamiast pojedynczego spłaszczonego sprzężenia.

Zapytanie GraphQL

query {
  books {
    items {
      id
      title
      category {
        id
        name
      }
    }
  }
}

Koncepcyjny język SQL

SELECT
  b.id,
  b.sku_title AS title,
  c.id AS category_id,
  c.name AS category_name
FROM dbo.books AS b
JOIN dbo.categories AS c
  ON b.category_id = c.id;

Przykładowa odpowiedź

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        },
        {
          "id": 2,
          "title": "Foundation",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        }
      ]
    }
  }
}

Wybór jeden do wielu

Możesz również przejść przez odwrotną relację. Ponownie język SQL jest koncepcyjny; rzeczywiste wykonanie może deduplikować wiersze nadrzędne i zmaterializować kolekcje podrzędne oddzielnie.

Zapytanie GraphQL

query {
  categories {
    items {
      id
      name
      books {
        items {
          id
          title
        }
      }
    }
  }
}

Koncepcyjny język SQL

SELECT
  c.id,
  c.name,
  b.id AS book_id,
  b.sku_title AS title
FROM dbo.categories AS c
JOIN dbo.books AS b
  ON c.id = b.category_id;

Przykładowa odpowiedź

{
  "data": {
    "categories": {
      "items": [
        {
          "id": 10,
          "name": "Sci-Fi",
          "books": {
            "items": [
              { "id": 1, "title": "Dune" },
              { "id": 2, "title": "Foundation" }
            ]
          }
        }
      ]
    }
  }
}

Przykładowa konfiguracja

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

Zobacz także

Concept REST GraphQL Przeznaczenie
Projection $select Elementy Wybieranie pól, które mają być zwracane
Filtering $filter filtr Ograniczanie wierszy według warunku
Sortowanie $orderby orderBy Definiowanie kolejności sortowania
Rozmiar strony $first first Ogranicz liczbę elementów na stronę
Kontynuacja $after po Kontynuuj z ostatniej strony przy użyciu kursora

Uwaga / Notatka

Słowa kluczowe REST zaczynają się od , zgodnie z $konwencjami OData.