共用方式為


GraphQL for Data API 建立器中的多個突變

數據 API 產生器 (DAB) 支援將多個突變作業結合成單一交易。 多個突變支援您需要建立屬於相同實體的多個專案,或建立屬於相關實體的多個項目的情況。 本指南會說明使用多重突變作業的範例。

先決條件

  • 現有的 SQL 伺服器和資料庫。
  • 數據 API 產生器 CLI。 安裝 CLI
  • 資料庫用戶端 (SQL Server Management Studio、Azure Data Studio 等)

建立數據表

首先,建立兩個基本數據表來代表書籍及其各自的章節。 書籍與其對應的章節有 一對多 關係。

  1. 使用您慣用的用戶端或工具連線到 SQL 資料庫。

  2. 使用名稱為 Books 的資料表,建立具有 idtitleyearpages 欄位。

    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. 建立另一個名為 Chapters 並包含 idnamepages 欄位的表格。 建立一個 book_id 欄位,其與 id 欄位在 Books 表中有 外鍵 關聯。

    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_STRING殼層變數。

    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 上一個步驟中建立的殼層變數。
    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相對端點。 此端點會開啟香蕉蛋糕 Pop 介面。

    備註

    根據預設,這會是 https://localhost:5001/graphql

  3. 撰寫 GraphQL 突變,以在資料庫中的兩個數據表之間建立三個不同的數據列。 這項突變會在單一的「多重建立」作業中使用 BookChapter 實體。 針對突變使用下列屬性。

    實體類型 ID 名稱 頁面
    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
    

    備註

    此查詢應該會傳回兩個章節記錄。