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
ミューテーションを使用して、個々のデータベース テーブルを 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 拡張機能の Code Lens を使用して、_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",
}
…
}