播種資料並執行大量資料作業

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 類型之外,納入 ActorMovieActor 類型,以便我們製作更複雜的查詢原型。

# 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"
}

寫入異動,為零狀態資料播種

在製作原型時,如果查詢和變異會需要針對一系列離散值進行測試,您可以使用多個記錄填入資料。舉例來說,您可能想新增多部電影記錄,並為這些記錄加入不同類型的類別和分級,以便測試比較和篩選功能。

將資料放入 MovieActor 資料表

視原型設計的階段而定,您可以使用「開始使用」指南中介紹的相同技巧,插入一或兩個記錄:也就是說,您可以使用 VS Code 擴充功能中的 Code Lenses 建立 _insert 變異、硬式編碼資料,並在 VS Code 中執行這些變異

最後,使用 _insertMany 運算將多筆記錄新增至資料表會更有意義。在電影評論應用程式範例中,這會在 MovieActor 中插入初始資料集。

如要執行下列變異,請使用 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",
    }
   
}

後續步驟