Wyjściowe dane i wykonywanie zbiorczych operacji na danych

W Firebase Data Connect możesz wykonywać zbiorcze wczytywanie i aktualizowanie danych na różne sposoby w zależności od przepływów pracy i środowisk:

  • W lokalnym prototypowaniu podczas testowania alternatywnych schematów mutacje wypełniania danych można tworzyć i wywoływać w lokalnym środowisku programistycznym za pomocą rozszerzenia VS Code, emulatora Data Connect i lokalnej instancji bazy danych.

  • W środowisku produkcyjnym ze stabilnym schematem, podczas wykonywania większych przepływów CI/CD i zarządzania danymi produkcyjnymi, masz 2 możliwości:

    • Preferowanym rozwiązaniem jest użycie Firebase Admin SDK, czyli zestawu bibliotek działających w środowiskach z podwyższonymi uprawnieniami.

    • Możesz też używać narzędzi SQL z instancją Cloud SQL do wykonywania zbiorczych wczytań i aktualizacji, o ile modyfikujesz dane, a nie schemat bazy danych. Bezpośrednie modyfikowanie schematu bazy danych za pomocą narzędzi SQL może spowodować uszkodzenie schematu Data Connect i łączników.

Lokalne prototypowanie: dane początkowe w instancjach lokalnych

W przewodniku dla początkujących skonfigurowano aplikację, która dodaje pojedynczy rekord do pojedynczej tabeli za pomocą mutacji wstawiania ad hoc.

Aby aplikacja do recenzowania filmów była użyteczna, potrzebuje danych o filmach, recenzjach i użytkownikach do prototypowania zapytań i mutacji, które używają złączeń i innych operacji na wielu tabelach z realistycznymi danymi. Możesz rozszerzyć schemat i wypełnić bazę danych.

Środowisko prototypowania wymaga kodu do wypełniania danych. W tym przewodniku znajdziesz przykłady ilustrujące:

  • Używanie symboli _insertMany_upsertMany w poszczególnych tabelach
  • Używanie symbolu _insertMany w powiązanych tabelach

Aktualizowanie schematu aplikacji do oceniania filmów

Za pomocą mutacji _insertMany_upsertMany możesz aktualizować poszczególne tabele bazy danych pojedynczo lub wiele tabel powiązanych relacjami złączenia. Poniżej znajdziesz rozbudowany schemat aplikacji do recenzowania filmów, który ilustruje te przypadki użycia i przykłady. Rozszerza on typ schema.gql poza początkowy typ Movie, aby obejmować typy ActorMovieActor, dzięki czemu możemy tworzyć prototypy bardziej złożonych zapytań.

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

Zapisywanie mutacji w danych początkowych stanu zerowego

Podczas tworzenia prototypu, gdy zapytania i mutacje wymagają przetestowania na podstawie zakresu odrębnych wartości, możesz wypełnić dane wieloma rekordami. Na przykład możesz dodać wiele rekordów filmów z różnymi gatunkami i ocenami, aby przetestować porównania i filtrowanie.

Wypełnianie tabel MovieActor danymi początkowymi

W zależności od etapu tworzenia prototypu możesz użyć tej samej techniki, którą opisaliśmy w przewodniku dla początkujących, aby wstawić 1 lub 2 rekordy. Możesz na przykład użyć funkcji CodeLenses w rozszerzeniu VS Code, aby utworzyć _insertmutacje, zakodować dane na stałe i uruchomić te mutacje w VS Code.

W końcu bardziej sensowne jest dodanie wielu rekordów do tabeli za pomocą operacji _insertMany. W przykładzie aplikacji do recenzowania filmów wstawia to początkowy zestaw danych w MovieActor.

Aby wykonać te mutacje za pomocą rozszerzenia Firebase w VS Code, w odpowiednim widoku edytora plików kliknij przycisk CodeLens Uruchom (produkcyjny) lub Uruchom (lokalny), w zależności od tego, czy prototypujesz za pomocą usługi produkcyjnej czy lokalnej bazy danych.

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

Wstawianie danych początkowych do MovieActor tabeli złączeń

Aby testować zapytania i mutacje z użyciem złączeń i innych złożonych operacji, możesz dodać do tabeli MovieActor wiele rekordów.

Jeśli aktualizujesz wiele tabel w tego rodzaju relacji, możesz dodać dyrektywę @transaction, aby mieć pewność, że aktualizacja zostanie przeprowadzona prawidłowo.

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

Zapisywanie mutacji w celu zresetowania danych początkowych

Podczas tworzenia prototypów i wykonywania CI/CD przydatne może być resetowanie danych do stanu zerowego w celu przeprowadzenia nowej serii testów na nowym zestawie danych.

Jeśli kod prototypu nie dodaje rekordów do tabel, użyj mutacji _upsertMany udostępnianej przez Data Connect.

W tym przykładzie funkcja movie_upsertMany jest wywoływana z wartościami początkowymi, aby przywrócić rekordy filmów do pierwotnego stanu.

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

Rozwój wersji produkcyjnej: użyj ikony Admin SDK, aby wypełnić i zaktualizować

Firebase Admin SDK jest dostępna, gdy chcesz pracować w środowiskach uprzywilejowanych. Jest to ważne w przypadku wczytywania tysięcy rekordów ze względu na krytyczny charakter operacji na danych zbiorczych w przypadku danych produkcyjnych.

Zainstaluj Firebase Admin SDK

Nawet jeśli pracujesz głównie lokalnie, Firebase zaleca skonfigurowanie Admin SDK, aby móc używać Firebase Data Connect w środowisku z uprawnieniami, w tym w środowisku lokalnym. Musisz skonfigurować Admin SDK dla Node.js.

Więcej informacji o korzystaniu z pakietu Admin SDK w innych Data Connectprzypadkach użycia

przeprowadzać zbiorcze wczytywanie i aktualizowanie danych produkcyjnych;

Interfejs API do zarządzania danymi zbiorczymi tworzy mutacje GraphQL w Twoim imieniu, zamiast prosić Cię o tworzenie ciągów znaków mutation {...} za pomocą opisanego wcześniej interfejsu executeGraphQL API w celu dodawania lokalnie kilku wierszy.

Główną zaletą interfejsu API administracyjnego jest możliwość oddzielnego zarządzania tablicami danych i ponownego ich wykorzystywania w przepływach CI/CD oraz konfigurowania dużych plików danych zbiorczych na potrzeby danych produkcyjnych.

Poniższe fragmenty kodu pokazują, jak skonfigurować skrypt danych zbiorczych.

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

Rozwój wersji produkcyjnej: używanie SQL do zbiorczych aktualizacji danych

Jeśli pracujesz ze stabilnym schematem w środowisku produkcyjnym i nie modyfikujesz schematu, możesz zarządzać wczytywaniem i aktualizowaniem danych w instancji Cloud SQL.

Zapoznaj się z przewodnikiem importowania danych w Cloud SQL for PostgreSQL.

Co dalej?