在 Firebase Data Connect 中,大量資料作業會透過變異來執行。即使 Data Connect 專案會將資料儲存在 PostgreSQL 中,您也無法使用 SQL 陳述式或 SQL 工具大量載入資料:Data Connect 服務及其結構定義必須與資料庫保持同步,直接在 PostgreSQL 中運作會中斷這項同步作業。
因此,Data Connect 為種子資料和大量資料管理提供標準的 _insertMany
、_upsertMany
和 _deleteMany
異動。
當您為應用程式設計原型,以及執行 CI/CD 流程時,可以透過 VS Code 擴充功能、Data Connect 模擬器,以及 (選用) 本機資料庫執行個體,在本機開發環境中呼叫這些變動。
在本機和實際工作環境的執行個體中播種資料
在入門指南中,您已設定應用程式,以便使用臨時插入變異來將單一記錄新增至單一資料表。
為了讓電影評論應用程式可供使用,您需要電影、評論和使用者的資料,以便在多個含有實際資料的資料表上,使用彙整和其他運算來建立查詢和變異。您可以擴充結構定義並為資料庫播種。
原型設計環境需要程式碼才能執行資料播種作業。本指南提供一些範例,說明以下內容:
- 在個別資料表上使用
_insertMany
和_upsertMany
- 在相關資料表上使用
_insertMany
更新電影評論應用程式結構定義
您可以使用 _insertMany
和 _upsertMany
變異來一次更新個別資料庫資料表,或更新多個透過彙整關聯的資料表。下方是電影評論應用程式結構定義的擴充版本,可用於說明這些用途和範例。它會將 schema.gql
擴展至起始 Movie
類型之外,納入 Actor
和 MovieActor
類型,以便我們製作更複雜的查詢原型。
# Actors
# Suppose an actor can participate in multiple movies and movies can have multiple actors
# Movie - Actors (or vice versa) is a many to many relationship
type Actor @table {
id: UUID!
imageUrl: String!
name: String! @col(name: "name", dataType: "varchar(30)")
}
# Join table for many-to-many relationship for movies and actors
# The 'key' param signifies the primary key(s) of this table
# In this case, the keys are [movieId, actorId], the generated fields of the reference types [movie, actor]
type MovieActor @table(key: ["movie", "actor"]) {
# @ref creates a field in the current table (MovieActor) that holds the primary key of the referenced type
# In this case, @ref(fields: "movieId", references: "id") is implied
movie: Movie!
# movieId: UUID! <- this is created by the implied @ref
actor: Actor!
# actorId: UUID! <- this is created by the implied @ref
role: String! # "main" or "supporting"
}
寫入異動,為零狀態資料播種
在原型設計期間,如需針對一系列不連續的值測試查詢和異動,您可以使用多筆記錄填入資料。舉例來說,您可能想新增多部電影記錄,並為這些記錄加入不同類型的類別和分級,以便測試比較和篩選功能。
已將種子資料加入 Movie
和 Actor
資料表
視原型設計的階段而定,您可以使用「開始使用」指南中介紹的相同技巧,插入一或兩個記錄:也就是說,您可以使用 VS Code 擴充功能中的 Code Lenses 建立 _insert
變異、硬式編碼資料,並在 VS Code 中執行這些變異。
最後,使用 _insertMany
運算將多筆記錄新增至資料表會更有意義。在電影評論應用程式範例中,這會在 Movie
和 Actor
中插入初始資料集。
如要執行下列變異,請使用 VS Code Firebase 擴充功能,在適當的檔案編輯器檢視畫面中,按一下「Run (Production)」或「Run (Local)」 CodeLens 按鈕,視您是要使用正式版服務還是本機資料庫製作原型而定。
# insertMany for Movie
# 2 records shown
mutation {
movie_insertMany(data: [
{
id: "550e8400-e29b-41d4-a716-446655440000",
title: "Inception",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
genre: "sci-fi",
},
{
id: "550e8400-e29b-41d4-a716-446655440001",
title: "The Matrix",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
genre: "action",
}
])
}
# insertMany for Actor
# 2 records shown
mutation {
actor_insertMany(data: [
{
id: "123e4567-e89b-12d3-a456-426614174000",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
name: "Leonardo DiCaprio"
},
{
id: "123e4567-e89b-12d3-a456-426614174001",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
name: "Keanu Reeves"
}
])
}
將資料播種至 MovieActor
彙整資料表
如要使用彙整和其他複雜作業來測試查詢和突變,您可以將多筆記錄新增至 MovieActor
資料表。
在這裡,當您以這種關係更新多個資料表時,您可以新增 @transaction
指令,確保更新作業正確完成。
mutation @transaction {
movie_insertMany(data: [
{
id: "550e8400-e29b-41d4-a716-446655440000",
title: "Inception",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
genre: "sci-fi",
},
{
id: "550e8400-e29b-41d4-a716-446655440001",
title: "The Matrix",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
genre: "action",
}
])
actor_insertMany(data: [
{
id: "123e4567-e89b-12d3-a456-426614174000",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
name: "Leonardo DiCaprio"
},
{
id: "123e4567-e89b-12d3-a456-426614174001",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
name: "Keanu Reeves"
}
])
}
編寫變異來重設種子資料
在製作原型並執行 CI/CD 時,將資料重設為零狀態,以便針對新資料執行新系列測試,可能會很有幫助。
為此,如果原型程式碼未將記錄新增至資料表,請使用 Data Connect 提供的 _upsertMany
變異。
在下列範例中,系統會使用初始值呼叫 movie_upsertMany
,將電影記錄更新為原始狀態。
mutation {
# Execute an upsertMany operation to update the Movie table
movie_upsertMany(data: [
{
id: "550e8400-e29b-41d4-a716-446655440000",
title: "Inception",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
genre: "sci-fi",
},
{
id: "550e8400-e29b-41d4-a716-446655440001",
title: "The Matrix",
imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
genre: "action",
}
…
}