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

In Firebase Data Connect werden Bulk-Datenvorgänge mithilfe von Mutationen ausgeführt. Auch wenn Ihre Data Connect-Projekte Daten in PostgreSQL speichern, können Sie keine Bulk-Datenladungen mit SQL-Anweisungen oder SQL-Tools durchführen. Der Data Connect-Dienst und seine Schemas müssen mit Ihrer Datenbank synchronisiert bleiben. Wenn Sie direkt in PostgreSQL arbeiten, wird diese Synchronisierung unterbrochen.

In Data Connect verwenden Sie Mutationen, um Daten zu initialisieren und Bulk-Daten zu verwalten. Je nach Workflows und Umgebungen können Sie Mutationen für die Datenverwaltung auf unterschiedliche Weise erstellen und aufrufen:

  • Bei der lokalen Entwicklung können Sie beim Erstellen von App-Prototypen mithilfe der VS Code-Erweiterung, des Data Connect-Emulators und einer lokalen Datenbankinstanz Mutationen zum Daten-Seeding erstellen und in einer lokalen Entwicklungsumgebung aufrufen.

  • Wenn Sie bei der Produktionsentwicklung größere CI/CD-Abläufe ausführen und Produktionsdaten verwalten, können Sie die Firebase Admin SDK verwenden. Dabei handelt es sich um eine Reihe von Bibliotheken, die in privilegierten Umgebungen ausgeführt werden.

Lokale Entwicklung: Startdaten in lokalen Instanzen

Im Einstiegsleitfaden haben Sie eine App eingerichtet, mit der Sie einer einzelnen Tabelle mithilfe einer Ad-hoc-Insert-Mutation einen einzelnen Datensatz hinzufügen.

Damit die Filmbewertungs-App nutzbar ist, benötigt sie Daten zu Filmen, Rezensionen und Nutzern für Prototyping-Abfragen und ‑Mutationen, die Joins und andere Vorgänge auf mehreren Tabellen mit realistischen Daten verwenden. Sie können Ihr Schema erweitern und Ihre Datenbank mit Daten befüllen.

finden Sie die Beispieldaten und den Code, die in diesem Leitfaden verwendet werden.

Ihre Prototyping-Umgebung benötigt Code, um Daten zu erzeugen. Dieser Leitfaden enthält einige Beispiele, die Folgendes veranschaulichen:

  • Verwendung von _insertMany und _upsertMany in einzelnen Tabellen
  • Verwendung von _insertMany in verbundenen Tabellen

Schema der Filmrezensions-App aktualisieren

Mithilfe von _insertMany- und _upsertMany-Mutationen können Sie einzelne Datenbanktabellen einzeln oder mehrere Tabellen aktualisieren, die durch Join-Beziehungen miteinander verknüpft sind. Unten sehen Sie ein erweitertes Schema für eine Filmbewertungs-App, das diese Anwendungsfälle und Beispiele veranschaulicht. Er erweitert schema.gql über den ursprünglichen Movie-Typ hinaus auf die Typen Actor und MovieActor, damit wir Prototypen für komplexere Abfragen erstellen 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 Startdaten zu erstellen

Wenn Ihre Abfragen und Mutationen während des Prototypings anhand einer Reihe von diskreten Werten getestet werden müssen, können Sie die Daten mit mehreren Einträgen füllen. Sie können beispielsweise mehrere Filmdatensätze mit verschiedenen Genres und Bewertungen hinzufügen, um Vergleiche und Filterung zu testen.

Start- oder Testdaten in die Tabellen Movie und Actor einfügen

Je nach Phase des Prototyping können Sie dieselbe Methode wie im Leitfaden „Einstieg“ beschrieben verwenden, um einen oder zwei Einträge einzufügen. Sie können also CodeLenses in der VS Code-Erweiterung verwenden, um _insertMutationen zu erstellen, Daten zu hartcodieren und diese Mutationen in VS Code auszuführen.

Es ist jedoch sinnvoller, viele Datensätze mit einem _insertMany-Vorgang in eine Tabelle einzufügen. Im Beispiel für die Filmrezensions-App wird dadurch ein erster Datensatz in Movie und Actor eingefügt.

Um die folgenden Mutationen auszuführen, klicken Sie in der entsprechenden Dateieditoransicht mit der VS Code Firebase-Erweiterung auf die CodeLens-Schaltflächen Ausführen (Produktion) oder Ausführen (lokal), je nachdem, ob Sie einen Prototyp mit Ihrem Produktionsdienst oder einer lokalen Datenbank erstellen.

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

Daten in die MovieActor-Join-Tabelle 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 dieser Art von Beziehung aktualisieren, können Sie die Anweisung @transaction hinzufügen, damit 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 der Startdaten schreiben

Beim Erstellen von Prototypen und beim Ausführen von CI/CD kann es nützlich sein, die Daten auf den Nullzustand zurückzusetzen, um eine neue Reihe von Tests mit neuen Daten auszuführen.

Wenn Ihr Prototypcode Ihren Tabellen keine Einträge hinzufügt, verwenden Sie dazu die von Data Connect bereitgestellte _upsertMany-Mutation.

Im folgenden Beispiel wird movie_upsertMany mit den Anfangswerten aufgerufen, um Filmdatensätze in ihren ursprünglichen Zustand zu versetzen.

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

Produktionsentwicklung: Mit Admin SDK füllen und 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 Einträgen laden möchten, da Bulk-Datenvorgänge für Ihre Produktionsdaten kritisch sind.

Firebase Admin SDK installieren

Auch wenn Sie hauptsächlich lokal arbeiten, empfiehlt Firebase, die Admin SDK so einzurichten, dass 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

Bulk-Ladevorgänge und Aktualisierungen von Produktionsdaten ausführen

Die API für die Bulk-Datenverwaltung erstellt GraphQL-Mutationen in Ihrem Namen, anstatt dass Sie mutation {...}-Strings mit der oben beschriebenen executeGraphQL API erstellen müssen, um hier und da lokal ein paar Zeilen hinzuzufügen.

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

In den folgenden Snippets wird gezeigt, wie Sie ein Script für Bulk-Daten 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);

Nächste Schritte