数据 API 生成器GraphQL中的多个变化

数据 API 生成器 (DAB) 支持将多个突变操作组合到单个事务中。 多个突变支持需要创建属于同一实体的多个项或创建属于相关实体的多个项的方案。 本指南使用多重突变操作演练示例方案。

先决条件

  • 现有 SQL Server 和数据库。
  • 数据 API 生成器 CLI。 安装 CLI
  • 数据库客户端 (SQL Server Management Studio、Azure Data Studio 等 )

创建表

首先创建两个基本表来表示书籍及其各自的章节。 书籍与其相应的章节具有 一对多 关系。

  1. 使用首选客户端或工具连接到 SQL 数据库。

  2. Create名为 Booksidtitleyearpages 列的表。

    DROP TABLE IF EXISTS dbo.Books;
    
    CREATE TABLE dbo.Books
    (
        id int NOT NULL PRIMARY KEY,
        title nvarchar(1000) NOT NULL,
        [year] int null,
        [pages] int null
    )
    GO
    
  3. Create名为 的另一个Chapters表,其中包含 idnamepages 列。 Create与book_id表列Books具有外键关系的id列。

    DROP TABLE IF EXISTS dbo.Chapters;
    
    CREATE TABLE dbo.Chapters
    (
        id int NOT NULL PRIMARY KEY,
        [name] nvarchar(1000) NOT NULL,
        [pages] int null,
        book_id int NOT NULL,
        FOREIGN KEY (book_id) REFERENCES dbo.Books(id)
    )
    GO
    
  4. 验证表是否使用一些常见的 SQL 查询创建。

    SELECT * FROM dbo.Books
    
    SELECT * FROM dbo.Chapters
    

    注意

    此时,查询不应返回任何数据。

生成配置文件

现在,使用 DAB CLI 创建配置文件、实体和实体关系。

  1. 打开终端

  2. 将 SQL 数据库连接字符串存储为名为 的 SQL_CONNECTION_STRINGshell 变量。

    SQL_CONNECTION_STRING="<your-sql-connection-string>"
    
    $SQL_CONNECTION_STRING="<your-sql-connection-string>"
    
  3. 运行 dab init 指定以下属性。

    database-type mssql
    graphql.multiple-create.enabled true
    host-mode development
    connection-string 使用在上一 SQL_CONNECTION_STRING 步中创建的 shell 变量。
    dab init --database-type "mssql" --graphql.multiple-create.enabled true --host-mode "development" --connection-string $SQL_CONNECTION_STRING
    
  4. 运行 dab add 以添加指定以下属性的 Book 实体。

    source dbo.Books
    permissions anonymous:*
    dab add Book --source "dbo.Books" --permissions "anonymous:*"
    
  5. 再次运行 dab add 以添加现在指定以下属性的 Chapter 实体。

    source dbo.Chapters
    permissions anonymous:*
    dab add Chapter --source "dbo.Chapters" --permissions "anonymous:*"  
    
  6. 运行 dab update 以创建指定以下属性的 Book to Chapter 关系。

    relationship chapters
    cardinality many
    dab update Book --relationship chapters --target.entity Chapter --cardinality many
    
  7. 最后,最后运行 dab update 一次,以创建指定以下属性的 Chapter to Book 关系。

    relationship book
    cardinality one
    dab update Chapter --relationship book --target.entity Book --cardinality one
    

执行多个创建突变

总结一下,请使用 DAB CLI 运行 API 并使用 Banana Cake Pop 测试 GraphQL 终结点。

  1. 使用当前配置启动运行时引擎。

    dab start
    
  2. 导航到 /graphql 正在运行的应用程序的相对终结点。 此终结点将打开“香蕉蛋糕流行”界面。

    注意

    默认情况下,此值为 https://localhost:5001/graphql

  3. 创作GraphQL突变,以在数据库中的两个表中创建三个不同的行。 此突变在单个“多重创建”操作中同时使用 BookChapter 实体。 对突变使用以下属性。

    实体类型 ID 名称 页数 Year
    书籍 1 数据 API 生成器简介 200 2024
    章节 2 配置文件 150
    章节 3 正在运行 50
    mutation {
      createBook(
        item: {
          id: 1
          title: "Introduction to Data API builder"
          pages: 200
          year: 2024
          chapters: [
            {
                id: 2
                name: "Configuration files", pages: 150 
            }
            {
                id: 3
                name: "Running", pages: 50
            }
          ]
        }
      ) {
        id
        title
        pages
        year
        chapters {
          items {
            name
            pages
          }
        }
      }
    }
    
  4. 观察突变的输出。 该突变为这两种实体类型创建了相关数据。

    {
      "data": {
        "createBook": {
          "id": 1,
          "title": "Introduction to Data API builder",
          "pages": 200,
          "year": 2024,
          "chapters": {
            "items": [
              {
                "name": "Configuration files",
                "pages": 150
              },
              {
                "name": "Running",
                "pages": 50
              }
            ]
          }
        }
      }
    }
    
  5. 使用GraphQL查询检索数据库中的所有书籍,包括其相关章节。

    query {
      books {
        items {
          pages
          title
          year
          chapters {
            items {
              name
              pages
            }
          }
        }
      }
    }
    

    注意

    此时,查询应返回包含两个章节的单本书。

  6. 使用书籍数组(包括其嵌套的章节数组)观察此查询的输出。

    {
      "data": {
        "books": {
          "items": [
            {
              "pages": 200,
              "title": "Introduction to Data API builder",
              "year": 2024,
              "chapters": {
                "items": [
                  {
                    "name": "Configuration files",
                    "pages": 150
                  },
                  {
                    "name": "Running",
                    "pages": 50
                  }
                ]
              }
            }
          ]
        }
      }
    }
    
  7. 使用首选客户端或工具再次连接到 SQL 数据库。

  8. 验证数据是否已使用 SQL 查询成功创建。

    SELECT 
        c.name AS chapterName,
        c.pages AS chapterPages,
        b.title AS bookName,
        b.year AS releaseYear
    FROM dbo.Chapters c
    LEFT JOIN dbo.Books b ON b.id = c.book_id
    

    注意

    此查询应返回两个章节记录。