Daten einfügen und Bulk-Datenvorgänge ausführen

In Firebase Data Connect können Sie Bulk-Datenladevorgänge und ‑Aktualisierungen je nach Ihren Workflows und Umgebungen auf verschiedene Arten ausführen:

  • Beim lokalen Prototyping können Mutations zum Seeding von Daten erstellt und in einer lokalen Entwicklungsumgebung mit der VS Code-Erweiterung, dem Data Connect-Emulator und einer lokalen Datenbankinstanz aufgerufen werden, wenn Sie alternative Schemas ausprobieren.

  • In der Produktionsentwicklung mit einem stabilen Schema haben Sie zwei Möglichkeiten, wenn Sie größere CI/CD-Abläufe ausführen und Produktionsdaten verwalten:

    • Der bevorzugte Ansatz ist die Verwendung von Firebase Admin SDK, einer Reihe von Bibliotheken, die in privilegierten Umgebungen ausgeführt werden.

    • Sie können auch SQL-Tools mit Ihrer Cloud SQL-Instanz verwenden, um Massenimporte und ‑aktualisierungen durchzuführen, solange Sie Daten und nicht Ihr Datenbankschema ändern. Wenn Sie Ihr Datenbankschema direkt mit SQL-Tools ändern, kann das Data Connect-Schema und die Connectors beschädigt werden.

Lokales Prototyping: Seed-Daten in lokalen Instanzen

Im Leitfaden für die ersten Schritte haben Sie eine App eingerichtet, um mit einer Ad-hoc-Einfügemutation einen einzelnen Datensatz in eine einzelne Tabelle einzufügen.

Damit die Filmbewertungs-App verwendet werden kann, sind Daten für Filme, Rezensionen und Nutzer erforderlich, um Abfragen und Mutationen zu prototypisieren, bei denen Joins und andere Operationen für mehrere Tabellen mit realistischen Daten verwendet werden. Sie können Ihr Schema erweitern und Ihre Datenbank mit Daten füllen.

In Ihrer Prototyping-Umgebung ist Code zum Seeding von Daten erforderlich. Dieser Leitfaden enthält einige Beispiele, die Folgendes veranschaulichen:

  • Verwendung von _insertMany und _upsertMany in einzelnen Tabellen
  • Verwendung von _insertMany in verknüpften Tabellen

Schema der App für Filmbesprechungen aktualisieren

Mit den Mutationen _insertMany und _upsertMany können Sie einzelne Datenbanktabellen nacheinander oder mehrere Tabellen aktualisieren, die durch Join-Beziehungen verknüpft sind. Unten sehen Sie ein erweitertes Schema für eine Filmbewertungs-App, das diese Anwendungsfälle und Beispiele veranschaulicht. schema.gql wird über den ursprünglichen Typ Movie hinaus auf die Typen Actor und MovieActor erweitert, sodass wir komplexere Anfragen prototypisieren können.

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

Mutationen schreiben, um Daten für den Nullstatus zu erstellen

Beim Prototyping können Sie Daten mit mehreren Datensätzen füllen, wenn Ihre Abfragen und Mutationen mit einer Reihe von diskreten Werten getestet werden müssen. Sie können beispielsweise mehrere Filmdatensätze mit verschiedenen Genres und Altersfreigaben hinzufügen, um Vergleiche und Filter zu testen.

Seed-Daten in die Tabellen Movie und Actor einfügen

Je nach Prototyping-Phase können Sie dieselbe Methode verwenden, die im Leitfaden „Erste Schritte“ beschrieben wird, um einen oder zwei Datensätze einzufügen. Das heißt, Sie können CodeLenses in der VS Code-Erweiterung verwenden, um _insert-Mutationen zu erstellen, Daten fest zu codieren und diese Mutationen in VS Code auszuführen.

Es ist sinnvoller, viele Datensätze mit einem _insertMany-Vorgang in eine Tabelle einzufügen. Im Beispiel für die Filmrezensions-App werden dadurch eine erste Gruppe von Daten in Movie und Actor eingefügt.

Wenn Sie die folgenden Mutationen mit der VS Code Firebase-Erweiterung ausführen möchten, klicken Sie in der entsprechenden Dateieditoransicht auf die CodeLens-Schaltflächen Ausführen (Produktion) oder Ausführen (Lokal), je nachdem, ob Sie Ihren Produktionsdienst oder eine lokale Datenbank für den Prototyp verwenden.

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

Ausgangsdaten in die MovieActor-Verknüpfungstabelle einfügen

Wenn Sie Abfragen und Mutationen mit Joins und anderen komplexen Vorgängen testen möchten, können Sie der Tabelle MovieActor mehrere Datensätze hinzufügen.

Wenn Sie mehrere Tabellen in einer solchen Beziehung aktualisieren, können Sie die @transaction-Anweisung hinzufügen, um sicherzustellen, dass die Aktualisierung ordnungsgemäß abgeschlossen wird.

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"
    }
  ])
}

Mutation zum Zurücksetzen von Quelldaten schreiben

Beim Prototyping und bei CI/CD kann es nützlich sein, die Daten auf den Ausgangszustand zurückzusetzen, um eine neue Reihe von Tests für einen neuen Datensatz auszuführen.

Wenn in Ihrem Prototypcode keine Datensätze in Ihre Tabellen eingefügt werden, verwenden Sie die _upsertMany-Mutation von Data Connect.

Im folgenden Beispiel wird movie_upsertMany mit den ursprünglichen Werten aufgerufen, um Filmdatensätze auf ihren ursprünglichen Zustand zurückzusetzen.

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

Entwicklung in der Produktion: Verwenden Sie Admin SDK, um Daten einzufügen und zu aktualisieren.

Die Firebase Admin SDK ist verfügbar, wenn Sie in privilegierten Umgebungen arbeiten möchten. Dies ist ein wichtiger Anwendungsfall, wenn Sie Tausende von Datensätzen laden möchten, da Bulk-Datenvorgänge für Ihre Produktionsdaten von entscheidender Bedeutung sind.

Installieren Sie Firebase Admin SDK.

Auch wenn Sie hauptsächlich lokal arbeiten, empfiehlt Firebase, die Admin SDK einzurichten, damit Sie Firebase Data Connect in einer privilegierten Umgebung verwenden können, einschließlich Ihrer lokalen Umgebung. Sie müssen die Admin SDK für Node.js einrichten.

Weitere Informationen zur Verwendung des Admin SDK in anderen Data Connect-Anwendungsfällen

Bulk-Ladevorgänge und ‑Aktualisierungen von Produktionsdaten durchführen

Die API für die Massendatenverwaltung erstellt GraphQL-Mutationen in Ihrem Namen, anstatt Sie aufzufordern, mutation {...}-Strings mit der oben beschriebenen executeGraphQL-API zu erstellen, um hier und da lokal einige Zeilen hinzuzufügen.

Ein großer Vorteil der Verwaltungs-API ist die Möglichkeit, Arrays von Daten für CI/CD-Abläufe separat zu verwalten und wiederzuverwenden oder große Bulk-Datendateien für Produktionsdaten einzurichten.

Die folgenden Snippets zeigen, wie Sie ein Bulk-Data-Skript einrichten.

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);

Entwicklung für die Produktion: SQL für Bulk-Datenaktualisierungen verwenden

Wenn Sie in der Produktion mit einem stabilen Schema arbeiten und es nicht ändern, können Sie Datenladevorgänge und ‑aktualisierungen in Ihrer Cloud SQL-Instanz verwalten.

Weitere Informationen finden Sie in der Cloud SQL for PostgreSQL-Anleitung zum Importieren von Daten.

Nächste Schritte