Di Firebase SQL Connect, Anda dapat melakukan pemuatan dan pembaruan data massal dengan berbagai cara, bergantung pada alur kerja dan lingkungan Anda:
Dalam pembuatan prototipe lokal, saat Anda mencoba skema alternatif, mutasi pengisian data dapat dibuat dan dipanggil di lingkungan pengembangan lokal menggunakan ekstensi SQL Connect VS Code, SQL Connect emulator, dan instance database lokal.
Dalam pengembangan produksi, dengan skema yang stabil, saat Anda melakukan alur CI/CD yang lebih besar dan mengelola data produksi, Anda memiliki dua opsi:
Pendekatan yang lebih disukai adalah menggunakan Firebase Admin SDK, sekumpulan library yang berjalan di lingkungan yang memiliki hak istimewa.
Anda juga dapat menggunakan alat SQL dengan instance Cloud SQL Anda untuk melakukan pemuatan dan pembaruan massal, selama Anda mengubah data dan bukan skema database. Mengubah skema database secara langsung dengan alat SQL dapat merusak skema SQL Connect dan konektor.
Pembuatan prototipe lokal: mengisi data 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 gabungan dan operasi lainnya pada beberapa tabel dengan data realistis. Anda dapat memperluas skema dan mengisi database.
Lingkungan pembuatan prototipe Anda memerlukan kode untuk melakukan pengisian data. Panduan ini memberikan beberapa contoh, yang mengilustrasikan:
- Penggunaan
_insertManydan_upsertManypada tabel individual - Penggunaan
_insertManypada tabel terkait
Memperbarui skema aplikasi ulasan film
Anda dapat menggunakan mutasi _insertMany dan _upsertMany untuk memperbarui tabel database individual satu per satu, atau memperbarui beberapa tabel yang terkait dengan hubungan gabungan. Skema aplikasi ulasan film yang diperluas yang membantu mengilustrasikan kasus penggunaan dan contoh ini ditunjukkan 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 mengisi data status kosong
Selama pembuatan prototipe, saat kueri dan mutasi perlu diuji terhadap berbagai nilai diskrit, Anda dapat mengisi data dengan beberapa data. Misalnya, Anda mungkin ingin menambahkan beberapa data film dengan berbagai jenis genre dan rating untuk menguji perbandingan dan pemfilteran.
Mengisi data ke dalam 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 data: yaitu, Anda
dapat menggunakan CodeLens di ekstensi SQL Connect VS Code untuk membuat _insert mutasi,
data hardcode, dan Menjalankan mutasi tersebut di VS Code.
Pada akhirnya, lebih masuk akal untuk menambahkan banyak data ke dalam tabel menggunakan operasi
_insertMany. Dalam contoh aplikasi ulasan film, hal ini akan menyisipkan kumpulan data awal di Movie dan Actor.
Untuk menjalankan mutasi berikut, menggunakan ekstensi SQL Connect 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"
}
])
}
Mengisi data ke dalam tabel gabungan MovieActor
Untuk menguji kueri dan mutasi menggunakan gabungan dan operasi kompleks lainnya, Anda dapat menambahkan beberapa data ke tabel MovieActor.
Di sini, saat Anda memperbarui beberapa tabel dalam jenis relasi ini, Anda dapat menambahkan direktif @transaction untuk memastikan pembaruan 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"
}
])
}
Mengisi data ke dalam tabel terkait menggunakan operasi bertingkat
Untuk mengisi tabel terkait secara atomik, Anda dapat melakukan penyisipan relasional bertingkat menggunakan payload literal. Tindakan ini akan membuat data induk dan data turunan terkait dalam satu operasi tanpa memerlukan korelasi kunci asing manual.
# 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" }
}
]
})
}
Menulis mutasi untuk mereset data pengisian
Saat membuat prototipe dan melakukan CI/CD, mereset data ke status kosong untuk menjalankan serangkaian pengujian baru pada kumpulan data baru dapat berguna.
Untuk melakukannya, jika kode prototipe tidak menambahkan data ke tabel, gunakan mutasi
_upsertMany yang disediakan oleh SQL 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 terutama bekerja secara lokal, Firebase merekomendasikan untuk menyiapkan Admin SDK agar Anda dapat menggunakan Firebase SQL Connect dari lingkungan yang memiliki hak istimewa, termasuk lingkungan lokal Anda. Anda harus menyiapkan Admin SDK untuk Node.js.
Anda dapat mempelajari lebih lanjut tentang menggunakan Admin SDK dalam kasus SQL Connect penggunaan lainnya.
Melakukan pemuatan dan pembaruan data produksi secara massal
API untuk pengelolaan data massal membuat mutasi GraphQL atas nama Anda, bukan meminta Anda membuat string mutation {...} dengan executeGraphQL API 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 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",
// 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);
Pengembangan produksi: menggunakan SQL untuk pembaruan data massal
Saat Anda bekerja dengan skema yang stabil dalam produksi, dan tidak mengubah skema, Anda dapat bekerja di instance Cloud SQL untuk mengelola pemuatan dan pembaruan data.
Lihat Cloud SQL untuk panduan PostgreSQL guna mengimpor data.
Apa langkah selanjutnya?
- Pelajari cara mengintegrasikan Admin SDK ke dalam SQL Connect project.