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

In Firebase SQL Connect können Sie Bulk-Datenladevorgänge und ‑aktualisierungen je nach Ihren Workflows und Umgebungen auf unterschiedliche Weise ausführen:

  • Beim lokalen Prototyping können Sie, wenn Sie alternative Schemas ausprobieren, Mutations zum Einfügen von Daten in einer lokalen Entwicklungsumgebung mit der SQL Connect VS Code-Erweiterung, dem SQL Connect-Emulator und einer lokalen Datenbankinstanz erstellen und aufrufen.

  • 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:

    • Die bevorzugte Methode ist die Verwendung der 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, sofern Sie Daten und nicht Ihr Datenbankschema ändern. Wenn Sie Ihr Datenbankschema direkt mit SQL-Tools ändern, kann das zu Problemen mit Ihrem SQL Connect-Schema und Ihren Connectors führen.

Lokales Prototyping: Seed-Daten in lokalen Instanzen

Im Leitfaden für den Einstieg 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 Vorgänge für mehrere Tabellen mit realistischen Daten verwendet werden. Sie können Ihr Schema erweitern und Ihre Datenbank mit Daten füllen.

Für die 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
  • _insertMany in verknüpften Tabellen verwenden

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 Filmrezensions-Apps, das diese Anwendungsfälle und Beispiele veranschaulicht. schema.gql wird über den Starttyp 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 zum Schreiben von Startdaten verwenden

Während der Prototyperstellung können Sie Daten mit mehreren Datensätzen füllen, wenn Ihre Abfragen und Mutationen anhand 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.

Daten in die Tabellen Movie und Actor einlesen

Je nach Phase des Prototypings können Sie dieselbe Methode wie im Leitfaden „Erste Schritte“ verwenden, um einen oder zwei Datensätze einzufügen. Das heißt, Sie können mit CodeLenses in der VS Code-Erweiterung „SQL Connect“ _insert-Mutationen erstellen, Daten fest codieren und diese Mutationen in VS Code ausführen.

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

Wenn Sie die folgenden Mutationen mit der VS Code-Erweiterung „SQL Connect“ ausführen möchten, klicken Sie in der entsprechenden Dateieditoransicht auf die CodeLens-Schaltflächen Run (Production) (Ausführen (Produktion)) oder Run (Local) (Lokal ausführen), je nachdem, ob Sie mit Ihrem Produktionsdienst oder einer lokalen Datenbank Prototypen 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 einlesen

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

Wenn Sie verknüpfte Tabellen atomar initialisieren möchten, können Sie mit Literal-Payloads einen verschachtelten relationalen Einfügevorgang ausführen. So werden der übergeordnete Datensatz und die zugehörigen untergeordneten Datensätze in einem einzigen Vorgang erstellt, ohne dass eine manuelle Fremdschlüsselkorrelation erforderlich ist.

Bei 1:n-Beziehungen geben Sie ein Array mit verschachtelten untergeordneten Datensätzen an. Bei 1-zu-1-Beziehungen geben Sie ein einzelnes verschachteltes untergeordnetes Objekt an.

# Nested insert for Movie and Review (one-to-many)
# 1 movie and 2 reviews shown
mutation {
  movie_insert(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",
    reviews_on_movie: [
      {
        id: "123e4567-e89b-12d3-a456-426614174002",
        rating: 5,
        reviewText: "Amazing concept!",
        user: { id: "user-uuid-123" }
      },
      {
        id: "123e4567-e89b-12d3-a456-426614174003",
        rating: 4,
        reviewText: "A bit confusing, but great.",
        user: { id: "user-uuid-456" }
      }
    ]
  })
}
# Nested insert for User and Profile (one-to-one)
mutation {
  user_insert(data: {
    id: "user-uuid-123",
    name: "Alice",
    profile_on_user: {
      bio: "Avid moviegoer and critic."
    }
  })
}

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 durch Ihren Prototypcode keine Datensätze in Ihre Tabellen eingefügt werden, verwenden Sie dazu die von SQL Connect bereitgestellte Mutation _upsertMany.

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 für die 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.

Firebase Admin SDK installieren

Auch wenn Sie hauptsächlich lokal arbeiten, empfiehlt Firebase, die Admin SDK einzurichten, damit Sie Firebase SQL 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 SQL Connect-Anwendungsfällen

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

Die API für die Bulk-Datenverwaltung erstellt GraphQL-Mutationen für Sie, anstatt Sie aufzufordern, mutation {...}-Strings mit der executeGraphQL-API zu erstellen, die oben beschrieben wurde, 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",
    // Nested reviews can be inserted atomically along with the movie
    reviews_on_movie: [
      {
        rating: 5,
        reviewText: "Amazing concept!",
        user: { id: "user-123" } // Link to existing user
      }
    ]
  },
  {
    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",
    reviews_on_movie: [
      {
        rating: 5,
        reviewText: "A masterpiece of sci-fi action.",
        user: { id: "user-456" }
      }
    ]
  }
];

// 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 in der Produktion: SQL für Massenaktualisierungen von Daten verwenden

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

Weitere Informationen finden Sie im Cloud SQL-Leitfaden für PostgreSQL zum Importieren von Daten.

Nächste Schritte