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
i_upsertMany
w poszczególnych tabelach - Używanie symbolu
_insertMany
w powiązanych tabelach
Aktualizowanie schematu aplikacji do oceniania filmów
Za pomocą mutacji _insertMany
i _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 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"
}
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 Movie
i Actor
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ć _insert
mutacje, 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 Movie
i Actor
.
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?
- Dowiedz się więcej o integrowaniu Admin SDK z Data Connectprojektami.