Melakukan seed data dan melakukan operasi data massal

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.

Itulah sebabnya Data Connect menyediakan mutasi _insertMany, _upsertMany, dan _deleteMany standar untuk seeding data dan pengelolaan data massal.

Saat Anda membuat prototipe aplikasi dan menjalankan alur CI/CD, mutasi ini dapat dipanggil di lingkungan pengembangan lokal menggunakan ekstensi VS Code, emulator Data Connect, dan (opsional) instance database lokal.

Data seed di instance lokal dan produksi

Di Panduan memulai, Anda menyiapkan aplikasi untuk menambahkan satu kumpulan 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 yang realistis. Anda dapat memperluas skema dan mengisi database.

Lingkungan pembuatan prototipe Anda memerlukan kode untuk melakukan seeding data. Panduan ini menyediakan beberapa contoh, yang menggambarkan:

  • Penggunaan _insertMany dan _upsertMany pada setiap tabel
  • Penggunaan _insertMany di 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 dan membantu menggambarkan kasus penggunaan dan contoh tersebut 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 seed 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 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 Lensa Kode 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 menyisipkan set data awal dalam 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 melakukan CI/CD, mereset data ke status nol untuk menjalankan serangkaian pengujian baru pada set data baru dapat berguna.

Untuk melakukannya, jika kode prototipe Anda tidak menambahkan kumpulan 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",
    }
   
}

Apa langkah selanjutnya?