W Firebase SQL 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 przypadku lokalnego prototypowania, gdy testujesz alternatywne schematy, mutacje inicjujące dane można tworzyć i wywoływać w lokalnym środowisku programistycznym za pomocą rozszerzenia SQL Connect VS Code, SQL Connect emulatora i lokalnej instancji bazy danych.
W przypadku programowania w środowisku produkcyjnym, gdy masz stabilny schemat i wykonujesz większe przepływy CI/CD oraz zarządzasz danymi produkcyjnymi, masz 2 możliwości:
Zalecamy używanie 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 zbiorczego wczytywania i aktualizowania danych, 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 SQL Connect i oprogramowania sprzęgającego.
Lokalne prototypowanie: inicjowanie danych w instancjach lokalnych
Aby aplikacja do oceniania filmów była użyteczna, potrzebuje danych o filmach, ocenach i użytkownikach do prototypowania zapytań i mutacji, które używają łączeń i innych operacji na wielu tabelach z realistycznymi danymi. Możesz rozszerzyć schemat i zainicjować bazę danych.
SQL ConnectŚrodowisko prototypowania wymaga kodu do inicjowania danych. W tym przewodniku znajdziesz kilka przykładów ilustrujących:
- użycie
_insertManyi_upsertManyw poszczególnych tabelach, - użycie
_insertManyw powiązanych tabelach.
Aktualizowanie schematu aplikacji do oceniania filmów
Możesz używać mutacji _insertMany i _upsertMany do aktualizowania poszczególnych tabel bazy danych pojedynczo lub do aktualizowania wielu tabel powiązanych relacjami łączenia. Poniżej znajdziesz rozszerzony schemat aplikacji do oceniania filmów, który pomoże Ci zilustrować te przypadki użycia i przykłady. Rozszerza on schema.gql poza początkowy typ Movie, aby uwzględnić typy Actor i MovieActor, dzięki czemu możemy prototypować bardziej złożone zapytania.
# 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"
}
Pisanie mutacji do inicjowania danych w stanie zerowym
Podczas prototypowania, gdy zapytania i mutacje muszą być testowane na podstawie zakresu odrębnych wartości, możesz wypełnić dane wieloma rekordami. Możesz na przykład dodać wiele rekordów filmów z różnymi gatunkami i ocenami, aby przetestować porównania i filtrowanie.
Inicjowanie danych w tabelach Movie i Actor
W zależności od etapu prototypowania możesz użyć tej samej techniki
przedstawionej w przewodniku dla początkujących, aby wstawić jeden lub dwa rekordy. Możesz użyć
CodeLenses w rozszerzeniu SQL Connect 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 oceniania filmów ta operacja wstawia początkowy zestaw danych w tabelach Movie i Actor.
Aby wykonać te mutacje za pomocą rozszerzenia SQL Connect VS Code, w odpowiednim widoku edytora plików kliknij przyciski CodeLens Uruchom (produkcja) lub Uruchom (lokalnie), 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"
}
])
}
Inicjowanie danych w tabeli łączenia MovieActor
Aby testować zapytania i mutacje za pomocą łączeń i innych złożonych operacji, możesz dodać wiele rekordów do tabeli MovieActor.
W tym przypadku, gdy 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"
}
])
}
Inicjowanie danych w powiązanych tabelach za pomocą operacji zagnieżdżonych
Aby inicjować powiązane tabele atomowo, możesz wykonać zagnieżdżone wstawianie relacyjne za pomocą ładunków literałów. Spowoduje to utworzenie rekordu nadrzędnego i powiązanych z nim rekordów podrzędnych w ramach jednej operacji bez konieczności ręcznego korelowania kluczy obcych.
# Nested insert for Movie and Review
# 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" }
}
]
})
}
Pisanie mutacji do resetowania danych inicjujących
Podczas prototypowania i wykonywania CI/CD może się przydać zresetowanie danych do stanu zerowego, aby można było wykonać nową serię testów na nowym zestawie danych.
Jeśli kod prototypu nie dodaje rekordów do tabel, użyj mutacji
_upsertMany udostępnianej przez SQL Connect.
W tym przykładzie wywoływana jest funkcja movie_upsertMany 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",
}
…
}
Programowanie w środowisku produkcyjnym: używanie Admin SDK do wypełniania i aktualizowania danych
Pakiet Firebase Admin SDK jest dostępny, gdy chcesz pracować w środowiskowych z podwyższonymi uprawnieniami. Jest to ważny przypadek użycia, gdy chcesz wczytać tysiące rekordów, biorąc pod uwagę krytyczny charakter operacji zbiorczych na danych produkcyjnych.
Instalowanie pakietu Firebase Admin SDK
Nawet jeśli pracujesz głównie lokalnie, Firebase zaleca skonfigurowanie Admin SDK aby móc używać Firebase SQL Connect w środowisku z podwyższonymi uprawnieniami, w tym w środowisku lokalnym. Musisz skonfigurować Admin SDK dla Node.js.
Więcej informacji o korzystaniu z pakietu Admin SDK w innych SQL Connect przypadkach użycia.
Wykonywanie zbiorczego wczytywania i aktualizowania danych produkcyjnych
Interfejs API do zarządzania zbiorczego danymi tworzy mutacje GraphQL w Twoim imieniu, zamiast prosić Cię o tworzenie ciągów mutation {...} za pomocą interfejsu API executeGraphQL opisanego wcześniej do dodawania kilku wierszy tu i tam lokalnie.
Główną zaletą interfejsu API administracyjnego jest możliwość oddzielnego zarządzania tablicami danych i ponownego ich używania w przepływach CI/CD lub konfigurowania dużych plików zbiorczych danych produkcyjnych.
Poniższe fragmenty kodu pokazują, jak skonfigurować skrypt zbiorczy.
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);
Programowanie w środowisku produkcyjnym: używanie SQL do zbiorczych aktualizacji danych
Gdy pracujesz ze stabilnym schematem w środowisku produkcyjnym i nie modyfikujesz schematu, możesz pracować w instancji Cloud SQL, aby zarządzać wczytywaniem i aktualizowaniem danych.
Informacje o importowaniu danych znajdziesz w Cloud SQL przewodniku Cloud SQL for PostgreSQL.
Co dalej?
- Dowiedz się więcej o integrowaniu Admin SDK z projektami SQL Connect.