データ API ビルダー (DAB) では、複数のミューテーション操作を 1 つのトランザクションにまとめる方法がサポートされています。 複数のミューテーションでは、同じエンティティに属する複数のアイテムを作成するか、関連エンティティに属する複数のアイテムを作成する必要があるシナリオがサポートされています。 このガイドでは、複数のミューテーション操作を使用するサンプル シナリオについて説明します。
既存の SQL サーバーとデータベース。
データ API ビルダー CLI。 CLI をインストールする
データベース クライアント (SQL Server Management Studio、Azure Data Studio など)
まず、書籍とそれぞれの章を表す 2 つの基本的なテーブルを作成します。 書籍は、対応する章と 一対多 の関係を持っています。
任意のクライアントまたはツールを使用して SQL データベースに接続します。
、および 列を使用して という名前Books
のテーブルをyear
id
title
Createします。pages
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
Create、、および 列を使用して という名前Chapters
のid
name
別のテーブルを指定pages
します。 外部キー リレーションシップをbook_id
持つ列をテーブルのBooks
列にid
Createします。
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
一般的な SQL クエリでテーブルが作成されていることを検証します。
SELECT * FROM dbo.Books
SELECT * FROM dbo.Chapters
注意
この時点で、クエリはデータを返すべきではありません。
次に、DAB CLI を使用して、構成ファイル、エンティティ、およびエンティティリレーションシップを作成します。
ターミナルを開きます。
SQL データベース 接続文字列 を という名前SQL_CONNECTION_STRING
のシェル変数として格納します。
SQL_CONNECTION_STRING="<your-sql-connection-string>"
$SQL_CONNECTION_STRING="<your-sql-connection-string>"
次のプロパティを指定して を実行 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
を実行 dab add
して、次のプロパティを指定する Book エンティティを追加します。
テーブルを展開する
値
source
dbo.Books
permissions
anonymous:*
dab add Book --source "dbo.Books" --permissions "anonymous:*"
もう一度 を実行 dab add
して、次のプロパティを指定する Chapter エンティティを追加します。
テーブルを展開する
値
source
dbo.Chapters
permissions
anonymous:*
dab add Chapter --source "dbo.Chapters" --permissions "anonymous:*"
を実行 dab update
して、次のプロパティを指定する Book to Chapter リレーションシップを作成します。
テーブルを展開する
値
relationship
chapters
cardinality
many
dab update Book --relationship chapters --target.entity Chapter --cardinality many
最後に、最後に 1 回実行 dab update
して、次のプロパティを指定 して Chapter to Book リレーションシップを作成します。
テーブルを展開する
値
relationship
book
cardinality
one
dab update Chapter --relationship book --target.entity Book --cardinality one
処理をまとめるために、DAB CLI を使用して API を実行し、バナナ ケーキ ポップ を使用してGraphQL エンドポイントをテストします。
現在の構成を使用してランタイム エンジンを起動します。
dab start
実行中のアプリケーションの /graphql
相対エンドポイントに移動します。 このエンドポイントにより、Banana Cake Pop インターフェイスが開きます。
注意
既定では、これは になります https://localhost:5001/graphql
。
GraphQLミューテーションを作成して、データベース内の 2 つのテーブルに対して 3 つの異なる行を作成します。 このミューテーションでは、1 つの "複数作成 Book
" 操作で エンティティと Chapter
エンティティの両方が使用されます。 ミューテーションには、次のプロパティを使用します。
テーブルを展開する
エンティティ型
id
名前
ページ
Year
Book
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
}
}
}
}
ミューテーションからの出力を観察します。 ミューテーションによって、両方のエンティティ型の関連データが作成されました。
{
"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
}
]
}
}
}
}
GraphQL クエリを使用して、関連する章を含むデータベース内のすべての書籍を取得します。
query {
books {
items {
pages
title
year
chapters {
items {
name
pages
}
}
}
}
}
注意
この時点で、クエリは 2 つの章を含む単一の書籍を返す必要があります。
章の入れ子になった配列を含む書籍の配列を使用して、このクエリからの出力を確認します。
{
"data": {
"books": {
"items": [
{
"pages": 200,
"title": "Introduction to Data API builder",
"year": 2024,
"chapters": {
"items": [
{
"name": "Configuration files",
"pages": 150
},
{
"name": "Running",
"pages": 50
}
]
}
}
]
}
}
}
任意のクライアントまたはツールを使用して、SQL データベースにもう一度接続します。
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
注意
このクエリは、2 つのチャプター レコードを返す必要があります。