Di Firebase Data Connect, operasi data massal dilakukan menggunakan mutasi. Meskipun project Data Connect Anda menyimpan data di PostgreSQL, Anda tidak dapat memuat data secara massal menggunakan pernyataan SQL atau alat SQL: layanan Data Connect dan skema-nya harus tetap sinkron dengan database, dan beroperasi langsung di PostgreSQL akan merusak sinkronisasi ini.
Di Data Connect, Anda menggunakan mutasi untuk membuat seed data dan mengelola data massal. Anda dapat membuat dan memanggil mutasi pengelolaan data dengan cara yang berbeda-beda, bergantung pada alur kerja dan lingkungan Anda:
Dalam pengembangan lokal, saat Anda membuat prototipe aplikasi, mutasi penyemaian data dapat dibuat dan dipanggil di lingkungan pengembangan lokal menggunakan ekstensi VS Code, emulator Data Connect, dan instance database lokal.
Dalam pengembangan produksi, saat Anda menjalankan alur CI/CD yang lebih besar dan mengelola data produksi, Anda dapat menggunakan Firebase Admin SDK, sekumpulan library yang berjalan di lingkungan dengan hak istimewa.
Pengembangan lokal: data seed di instance lokal
Dalam Panduan memulai, Anda menyiapkan aplikasi untuk menambahkan satu data ke satu tabel menggunakan mutasi penyisipan ad hoc.
Agar dapat digunakan, aplikasi ulasan film memerlukan data untuk film, ulasan, dan pengguna untuk membuat prototipe kueri dan mutasi yang menggunakan join dan operasi lainnya di beberapa tabel dengan data yang realistis. Anda dapat memperluas skema dan mengisi database.
Lingkungan pembuatan prototipe Anda memerlukan kode untuk melakukan seeding data. Panduan ini memberikan beberapa contoh, yang menggambarkan:
- Penggunaan
_insertMany
dan_upsertMany
pada setiap tabel - Penggunaan
_insertMany
pada tabel terkait
Memperbarui skema aplikasi ulasan film
Anda dapat menggunakan mutasi _insertMany
dan _upsertMany
untuk memperbarui setiap
tabel database satu per satu, atau memperbarui beberapa tabel yang terkait dengan hubungan join. Skema aplikasi ulasan film yang diperluas yang membantu mengilustrasikan
kasus penggunaan dan contoh ini ditampilkan di bawah. Ini memperluas schema.gql
di luar
jenis Movie
awal untuk menyertakan jenis Actor
dan MovieActor
, sehingga kita dapat
membuat prototipe kueri yang lebih kompleks.
# 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"
}
Menulis mutasi untuk membuat data status kosong
Selama pembuatan prototipe, saat kueri dan mutasi perlu diuji terhadap rentang nilai terpisah, Anda dapat mengisi data dengan beberapa kumpulan data. Misalnya, Anda mungkin ingin menambahkan beberapa kumpulan data film dengan jenis genre dan rating yang berbeda untuk menguji perbandingan dan pemfilteran.
Menambahkan data ke tabel Movie
dan Actor
Bergantung pada tahap pembuatan prototipe, Anda dapat menggunakan teknik yang sama
yang diperkenalkan dalam panduan Memulai untuk menyisipkan satu atau dua kumpulan data: yaitu, Anda
dapat menggunakan CodeLenses di ekstensi VS Code untuk membuat mutasi _insert
,
data hard code, dan Menjalankan mutasi tersebut di VS Code.
Pada akhirnya, akan lebih masuk akal untuk menambahkan banyak data ke dalam tabel menggunakan operasi _insertMany
. Dalam contoh aplikasi ulasan film, tindakan ini akan menyisipkan
kumpulan data awal di Movie
dan Actor
.
Untuk menjalankan mutasi berikut, menggunakan ekstensi Firebase VS Code, di tampilan editor file yang sesuai, klik tombol CodeLens Run (Production) atau Run (Local), bergantung pada apakah Anda membuat prototipe dengan layanan produksi atau database lokal.
# 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"
}
])
}
Menambahkan data ke tabel join MovieActor
Untuk menguji kueri dan mutasi menggunakan join dan operasi kompleks lainnya, Anda dapat menambahkan beberapa data ke tabel MovieActor
.
Di sini, saat memperbarui beberapa tabel dalam jenis hubungan ini, Anda dapat
menambahkan perintah @transaction
untuk memastikan update selesai dengan benar.
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"
}
])
}
Menulis mutasi untuk mereset data seed
Saat membuat prototipe dan menjalankan CI/CD, mereset data ke status nol untuk menjalankan serangkaian pengujian baru pada kumpulan data baru dapat berguna.
Untuk melakukannya, jika kode prototipe Anda tidak menambahkan data ke tabel, gunakan mutasi _upsertMany
yang disediakan oleh Data Connect.
Dalam contoh berikut, movie_upsertMany
dipanggil dengan nilai awal
untuk memperbarui data film ke status aslinya.
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",
}
…
}
Pengembangan produksi: menggunakan Admin SDK untuk mengisi dan memperbarui
Firebase Admin SDK tersedia saat Anda ingin bekerja dari lingkungan yang memiliki hak istimewa. Ini adalah kasus penggunaan penting saat Anda ingin memuat ribuan data, mengingat sifat penting operasi data massal pada data produksi Anda.
Menginstal Firebase Admin SDK
Meskipun Anda bekerja secara lokal, Firebase merekomendasikan untuk menyiapkan Admin SDK agar Anda dapat menggunakan Firebase Data Connect dari lingkungan dengan hak istimewa, termasuk lingkungan lokal Anda. Anda harus menyiapkan Admin SDK untuk Node.js.
Anda dapat mempelajari lebih lanjut cara menggunakan Admin SDK dalam kasus penggunaan Data Connect lainnya.
Melakukan pemuatan dan pembaruan massal data produksi
API untuk pengelolaan data massal membuat mutasi GraphQL untuk Anda, bukan meminta Anda membuat string mutation {...}
dengan API executeGraphQL
yang dijelaskan sebelumnya untuk menambahkan beberapa baris di sana-sini secara lokal.
Manfaat utama API administratif adalah kemampuan untuk mengelola dan menggunakan kembali array data secara terpisah untuk alur CI/CD, atau menyiapkan file data massal yang besar untuk data produksi.
Cuplikan berikut menunjukkan cara menyiapkan skrip data massal.
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);
Apa langkah selanjutnya?
- Pelajari cara mengintegrasikan Admin SDK ke dalam project Data Connect.