Wyjściowe dane i wykonywanie zbiorczych operacji na danych

W Firebase Data Connect zbiorcze operacje na danych są wykonywane przy użyciu mutacji. Mimo że w projektach Data Connect dane są przechowywane w PostgreSQL, nie możesz ich wczytywać zbiorczo za pomocą poleceń SQL ani narzędzi SQL: usługa Data Connect i jej schematy muszą być zsynchronizowane z bazą danych, a działanie bezpośrednio w PostgreSQL spowoduje przerwanie tej synchronizacji.

Dlatego Data Connect udostępnia standardowe mutacje _insertMany, _upsertMany_deleteMany na potrzeby inicjowania danych i zbiorczego zarządzania danymi.

Podczas tworzenia prototypów aplikacji i uruchamiania przepływów CI/CD te mutacje można wywoływać w lokalnym środowisku programistycznym za pomocą rozszerzenia VS Code, emulatora Data Connect i (opcjonalnie) lokalnego wystąpienia bazy danych.

Dane wyjściowe w instancjach lokalnych i produkcyjnych

W przewodniku po rozpoczęciu konfigurujesz aplikację, aby dodać pojedynczy rekord do pojedynczej tabeli za pomocą ad hoc insert mutation.

Aby aplikacja do recenzowania filmów była przydatna, potrzebuje danych o filmach, recenzjach i użytkownikach na potrzeby prototypowania zapytań i mutacji, które wykorzystują złączenia i inne operacje na wielu tabelach z realistycznymi danymi. Możesz rozwinąć schemat i zainicjować bazę danych.

.

Środowisko prototypowania potrzebuje kodu do zasilania danych. Ten przewodnik zawiera przykłady ilustrujące:

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

Zaktualizuj schemat aplikacji z recenzjami filmów

Możesz używać operacji _insertMany i _upsertMany do aktualizowania pojedynczych tabel bazy danych pojedynczo lub wielu tabel powiązanych za pomocą relacji złączenia. Poniżej przedstawiamy rozszerzony schemat aplikacji do recenzowania filmów, który pomaga zilustrować te przypadki użycia i przykłady. Rozszerza ona schema.gql poza początkowy typ Movie, aby obejmowała 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 celu zainicjowania danych stanu początkowego

Podczas prototypowania, gdy zapytania i mutacje muszą być testowane pod kątem różnych wartości dyskretnych, możesz wypełniać dane wieloma rekordami. Można na przykład dodać wiele rekordów filmowych z różnymi typami gatunków i ocenami w celu przetestowania porównań i filtrowania.

Wprowadzanie danych do tabel Movie i Actor

W zależności od etapu prototypowania możesz użyć tej samej techniki opisanej w przewodniku „Rozpoczynanie pracy” do wstawiania jednego lub dwóch rekordów. Oznacza to, że możesz użyć narzędzia Code Lenses w rozszerzeniu VS Code, aby utworzyć mutacje _insert, zakodować dane i uruchomić te mutacje w VS Code.

W końcu lepszym rozwiązaniem 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 do elementów MovieActor.

Aby wykonać te mutacje, w odpowiednim widoku edytora plików w rozszerzeniu Firebase dla VS Code kliknij przycisk Uruchom (wersja produkcyjna) lub Uruchom (lokalnie) CodeLens, w zależności od tego, czy tworzysz prototyp 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"
    }
   ])
}

Wczytywanie danych do tabeli złączenia MovieActor

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

Gdy aktualizujesz wiele tabel w takim rodzaju relacji, możesz dodać dyrektywę @transaction, aby mieć pewność, że aktualizacja zostanie prawidłowo ukończona.

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

Napisz mutację, aby zresetować dane wyjściowe

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

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

W poniższym przykładzie metoda movie_upsertMany jest wywoływana z wartościami początkowymi, aby zaktualizować rekordy filmowe do ich 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",
    }
   
}

Co dalej?