データをシードし、一括データ オペレーションを実行する

Firebase Data Connect では、ワークフローと環境に応じて、さまざまな方法で一括データ読み込みと更新を実行できます。

  • ローカル プロトタイピングでは、代替スキーマを試すときに、VS Code 拡張機能、Data Connect エミュレータ、ローカル データベース インスタンスを使用して、ローカル開発環境でデータ シーディング ミューテーションを作成して呼び出すことができます。

  • 本番環境の開発では、安定したスキーマを使用して、大規模な CI/CD フローを実行し、本番環境データを管理する場合、次の 2 つのオプションがあります。

    • 推奨される方法は、特権環境で実行されるライブラリのセットである Firebase Admin SDK を使用することです。

    • データベース スキーマではなくデータを変更する場合は、Cloud SQL インスタンスで SQL ツールを使用して一括読み込みと更新を行うこともできます。SQL ツールを使用してデータベース スキーマを直接変更すると、Data Connect スキーマとコネクタが破損する可能性があります。

ローカル プロトタイピング: ローカル インスタンスにシードデータを設定する

スタートガイドでは、アドホック挿入ミューテーションを使用して、単一のテーブルに単一のレコードを追加するようにアプリを設定します。

映画レビュー アプリを使用可能にするには、複数のテーブルで結合やその他のオペレーションを使用するプロトタイピング クエリとミューテーションに、映画、レビュー、ユーザーのデータが必要です。スキーマを拡張して、データベースにシードできます。

プロトタイピング環境には、データ シーディングを実行するコードが必要です。このガイドでは、次のことを示すサンプルをいくつか紹介します。

  • 個々のテーブルでの _insertMany_upsertMany の使用
  • 関連テーブルでの _insertMany の使用

映画レビュー アプリのスキーマを更新する

_insertMany ミューテーションと _upsertMany ミューテーションを使用すると、個々のデータベース テーブルを一度に 1 つずつ更新したり、結合関係で関連付けられた複数のテーブルを更新したりできます。これらのユースケースと例を説明するのに役立つ、映画レビュー アプリの拡張スキーマを以下に示します。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 テーブルにシードデータを挿入する

プロトタイピングの段階に応じて、スタートガイドで紹介したのと同じ手法を使用して、1 つまたは 2 つのレコードを挿入できます。つまり、VS Code 拡張機能の CodeLenses を使用して _insert ミューテーションを作成し、データをハードコードして、VS Code でそれらのミューテーションを実行できます。

最終的には、_insertMany オペレーションを使用してテーブルに多くのレコードを追加する方が理にかなっています。映画レビュー アプリの例では、これにより MovieActor に初期データセットが挿入されます。

VS Code Firebase 拡張機能を使用して次のミューテーションを実行するには、適切なファイル エディタ ビューで、本番環境サービスまたはローカル データベースでプロトタイピングを行っているかどうかに応じて、[実行(本番環境)] または [実行(ローカル)] 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",
    }
   
}

本番環境の開発: Admin SDK を使用して入力と更新を行う

Firebase Admin SDK は、特権環境で作業する場合に使用できます。これは、本番環境データのバルクデータ オペレーションの重要性を考えると、数千件のレコードを読み込む場合に重要なユースケースです。

Firebase Admin SDK をインストールする

主にローカルで作業する場合でも、ローカル環境などの特権環境から Firebase Data Connect を使用できるように Admin SDK を設定することをおすすめします。Node.js 用の Admin SDK を設定する必要があります。

他の Data Connect ユースケースでの Admin SDK の使用について詳しくは、こちらをご覧ください。

本番環境データの読み込みと更新を一括で行う

一括データ管理用の API は、mutation {...} 文字列を構築するよう求めるのではなく、GraphQL ミューテーションをユーザーに代わって構築します。これは、前述の executeGraphQL API を使用して、ローカルで数行を追加する場合とは異なります。

管理 API の大きなメリットは、CI/CD フローのデータ配列を個別に管理して再利用したり、本番環境データ用の大規模な一括データファイルをセットアップしたりできることです。

次のスニペットは、一括データ スクリプトを設定する方法を示しています。

import { initializeApp } from 'firebase-admin/app';
import { getDataConnect } from 'firebase-admin/data-connect';

const app = initializeApp();

const dc = getDataConnect({ location: "us-west2", serviceId: "my-service" });

const 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",
    }
];

// Methods of the bulk operations API
const resp = await dc.insert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.insertMany("movie" /*table name*/, data);

// Or
const resp = await dc.upsert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.upsertMany("movie" /*table name*/, data);

本番環境の開発: SQL を使用してデータを一括更新する

本番環境で安定したスキーマを使用しており、スキーマを変更しない場合は、Cloud SQL インスタンスでデータ読み込みと更新を管理できます。

Cloud SQL for PostgreSQL のデータ インポート ガイドをご覧ください。

次のステップ