在 GraphQL 中,请求的字段确切定义了数据 API 生成器(DAB)返回的内容,不多,也不少。 DAB 将这些选择编译为参数化 SQL,包括仅请求的映射(公开)列,以及它必须在内部提取的任何额外列。 这些列可能包括关系(外键)、主键或分页和游标构造中使用的稳定排序所需的列。
注释
GraphQL 没有通配符,如下所示 SELECT *。 客户端必须显式指定每个字段。
转到 本文档的 REST 版本。
基本选择
查询几个映射字段。
GraphQL 查询
query {
books {
items {
id
title
price
}
}
}
概念 SQL
SELECT
id,
sku_title AS title,
sku_price AS price
FROM dbo.books;
示例响应
{
"data": {
"books": {
"items": [
{
"id": 1,
"title": "Dune",
"price": 20
}
]
}
}
}
字段别名
别名重命名响应中的字段,而不是数据库中的字段。 SQL 层不为 GraphQL 字段名称别名;在数据检索后发生别名。
query {
books {
items {
id
bookTitle: title
cost: price
}
}
}
概念 SQL
SELECT
id,
sku_title AS title,
sku_price AS price
FROM dbo.books;
示例响应
使用别名:
{
"data": {
"books": {
"items": [
{
"id": 2,
"bookTitle": "Foundation",
"cost": 18
}
]
}
}
}
嵌套选择
配置中定义的关系允许嵌套查询。 下面的概念 SQL 显示了单个联接。 实际上,DAB 可以执行一个或多个参数化查询(例如,父查询加上批处理子提取),而不是单个平展联接。
GraphQL 查询
query {
books {
items {
id
title
category {
id
name
}
}
}
}
概念 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;
示例响应
{
"data": {
"books": {
"items": [
{
"id": 1,
"title": "Dune",
"category": {
"id": 10,
"name": "Sci-Fi"
}
},
{
"id": 2,
"title": "Foundation",
"category": {
"id": 10,
"name": "Sci-Fi"
}
}
]
}
}
}
一对多选择
还可以遍历反关系。 同样,SQL 是概念性的;实际执行可能会删除父行并单独具体化子集合。
GraphQL 查询
query {
categories {
items {
id
name
books {
items {
id
title
}
}
}
}
}
概念 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;
示例响应
{
"data": {
"categories": {
"items": [
{
"id": 10,
"name": "Sci-Fi",
"books": {
"items": [
{ "id": 1, "title": "Dune" },
{ "id": 2, "title": "Foundation" }
]
}
}
]
}
}
}
示例配置
{
"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" ]
}
}
}
}
}
另请参阅
| 概念 | REST | GraphQL | 目的 |
|---|---|---|---|
| 投影 | $select | 物品 | 选择要返回的字段 |
| Filtering | $filter | 滤波器 | 按条件限制行 |
| 排序 | $orderby | orderBy | 定义排序顺序 |
| 页面大小 | $first | first | 限制每页的项数 |
| 延续 | $after | 后 | 使用光标从最后一页继续 |
注释
REST 关键字以 $遵循 OData 约定开头。