W Firebase Data Connect operacje zbiorcze na danych są wykonywane za pomocą mutacji. Mimo że w projektach Data Connect dane są przechowywane w PostgreSQL, nie możesz wczytywać danych 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 zerwanie tej synchronizacji.
W Data Connect do zasilania danych i zarządzania danymi zbiorczymi używasz mutacji. Mutacje zarządzania danymi możesz tworzyć i wywoływać na różne sposoby w zależności od przepływów pracy i środowisk:
W lokalnym środowisku programistycznym, gdy tworzysz prototypy aplikacji, mutacje zasilania danymi mogą być tworzone i wywoływane w lokalnym środowisku programistycznym za pomocą rozszerzenia VS Code, emulatora Data Connect i lokalnej instancji bazy danych.
W rozwoju produkcyjnym, gdy wykonujesz większe przepływy CI/CD i zarządzasz danymi produkcyjnymi, możesz używać Firebase Admin SDK, czyli zestawu bibliotek działających w środowiskach uprzywilejowanych.
Lokalny proces programowania: dane początkowe w przypadkach lokalnych
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. W tym przewodniku znajdziesz kilka przykładów ilustrujących:
- Używanie funkcji
_insertMany
i_upsertMany
w poszczególnych tabelach - Używanie funkcji
_insertMany
w powiązanych tabelach
Aktualizacja schematu aplikacji do recenzowania filmów
Za pomocą mutacji _insertMany
i _upsertMany
możesz aktualizować poszczególne tabele bazy danych pojedynczo lub wiele 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 Actor
i MovieActor
, 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"
}
Tworzenie mutacji w celu zainicjowania danych stanu początkowego
Podczas prototypowania, gdy zapytania i mutacje muszą być testowane na różnych wartościach dyskretnych, możesz wypełniać dane wieloma rekordami. Do testowania porównań i filtrowania możesz na przykład dodać wiele rekordów filmów z różnymi gatunkami i ocenami.
inicjować dane w tabelach 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ć CodeLenses 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 Movie
i Actor
.
Aby wykonać te mutacje, w odpowiednim widoku edytora plików w rozszerzeniu Firebase w 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"
}
])
}
Tworzenie danych początkowych w tabeli złączeń 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"
}
])
}
Tworzenie zapytania typu mutation w celu zresetowania danych początkowych
Podczas tworzenia prototypu 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 tym przykładzie funkcja movie_upsertMany
jest wywoływana z wartościami początkowymi, aby zaktualizować rekordy filmów 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",
}
…
}
Rozwój produkcji: do wypełniania i aktualizowania użyj Admin SDK
Opcja Firebase Admin SDK jest dostępna, gdy chcesz pracować w uprzywilejowanych środowiskach. Jest to ważne w przypadku, gdy chcesz załadować tysiące rekordów, ponieważ operacje zbiorcze na danych produkcyjnych są bardzo ważne.
Zainstaluj aplikację Firebase Admin SDK.
Nawet jeśli pracujesz głównie lokalnie, Firebase zaleca skonfigurowanie funkcji Admin SDK, aby móc korzystać z Firebase Data Connect z prywatnego środowiska, w tym z otoczenia lokalnego. Musisz skonfigurować Admin SDK w Node.js.
Więcej informacji o używaniu pakietu Admin SDK w innych przypadkach użycia Data Connect znajdziesz w dokumentacji.
zbiorcze wczytywanie i aktualizowanie danych produkcyjnych;
Interfejs API do zbiorczego zarządzania danymi tworzy za Ciebie mutacje GraphQL, zamiast wymagać od Ciebie tworzenia ciągów znaków mutation {...}
za pomocą interfejsu API executeGraphQL
opisanego wcześniej w celu lokalnego dodawania kilku wierszy.
Największą zaletą interfejsu API administracyjnego jest możliwość osobnego zarządzania tablicami danych i ich ponownego używania w procesach CI/CD lub konfigurowania dużych plików danych zbiorczych na potrzeby danych produkcyjnych.
Poniższe fragmenty kodu pokazują, jak skonfigurować skrypt zbiorczego przetwarzania danych.
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);
Co dalej?
- Dowiedz się więcej o integrowaniu Admin SDK w projektach Data Connect.