ตั้งข้อมูลและดำเนินการข้อมูลจำนวนมาก

ใน Firebase Data Connect คุณสามารถโหลดและอัปเดตข้อมูลแบบเป็นกลุ่มได้หลายวิธี ขึ้นอยู่กับเวิร์กโฟลว์และสภาพแวดล้อมของคุณ

  • ในการสร้างต้นแบบในเครื่อง เมื่อลองใช้สคีมาอื่น คุณจะสร้างและเรียกใช้การเปลี่ยนแปลงการเริ่มต้นข้อมูลในสภาพแวดล้อมการพัฒนาในเครื่องได้โดยใช้ส่วนขยาย VS Code, อีมูเลเตอร์ Data Connect และอินสแตนซ์ฐานข้อมูลในเครื่อง

  • ในการพัฒนาเวอร์ชันที่ใช้งานจริงที่มีสคีมาที่เสถียร เมื่อดำเนินการ โฟลว์ CI/CD ที่ใหญ่ขึ้นและจัดการข้อมูลเวอร์ชันที่ใช้งานจริง คุณจะมี 2 ตัวเลือก ได้แก่

    • แนวทางที่แนะนำคือการใช้ Firebase Admin SDK ซึ่งเป็นชุดไลบรารี ที่ทำงานในสภาพแวดล้อมที่มีสิทธิ์

    • นอกจากนี้ คุณยังใช้เครื่องมือ SQL กับอินสแตนซ์ Cloud SQL เพื่อทำการโหลดและการอัปเดตแบบกลุ่มได้ ตราบใดที่คุณแก้ไขข้อมูลและไม่ใช่สคีมาของฐานข้อมูล การแก้ไขสคีมาฐานข้อมูลโดยตรงด้วยเครื่องมือ SQL อาจทำให้Data Connectสคีมาและตัวเชื่อมต่อเสียหาย

การสร้างต้นแบบในเครื่อง: ข้อมูลเริ่มต้นในอินสแตนซ์ในเครื่อง

ในคู่มือเริ่มต้นใช้งาน คุณตั้งค่าแอปเพื่อ เพิ่มระเบียนเดียวลงในตารางเดียวโดยใช้การเปลี่ยนแปลงการแทรกเฉพาะกิจ

แอปรีวิวภาพยนตร์ต้องมีข้อมูลสำหรับภาพยนตร์ รีวิว และผู้ใช้เพื่อ สร้างต้นแบบของคําค้นหาและการเปลี่ยนแปลงที่ใช้การรวมและ การดําเนินการอื่นๆ ในหลายตารางที่มีข้อมูลที่สมจริง คุณสามารถขยายสคีมาและเริ่มต้น ฐานข้อมูลได้

สภาพแวดล้อมการสร้างต้นแบบต้องมีโค้ดเพื่อทำการเริ่มต้นข้อมูล คู่มือนี้ มีตัวอย่างบางส่วนที่แสดงให้เห็นถึงสิ่งต่อไปนี้

  • การใช้ _insertMany และ _upsertMany ในตารางแต่ละรายการ
  • การใช้ _insertMany ในตารางที่เกี่ยวข้อง

อัปเดตสคีมาแอปรีวิวภาพยนตร์

คุณสามารถใช้การเปลี่ยนแปลง _insertMany และ _upsertMany เพื่ออัปเดตตารางฐานข้อมูลแต่ละตารางทีละตาราง หรืออัปเดตหลายตารางที่เกี่ยวข้องโดยใช้ความสัมพันธ์ในการเข้าร่วม สคีมาแอปรีวิวภาพยนตร์แบบขยายที่ช่วยอธิบาย Use Case และตัวอย่างเหล่านี้แสดงอยู่ด้านล่าง โดยจะขยาย schema.gql นอกเหนือจากประเภท Movie เริ่มต้นให้รวมถึงประเภท Actor และ MovieActor เพื่อให้เราสามารถสร้างต้นแบบคำค้นหาที่ซับซ้อนมากขึ้นได้

# 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"
}

เขียนการเปลี่ยนแปลงเพื่อเริ่มต้นข้อมูลสถานะค่าเป็นศูนย์

ในระหว่างการสร้างต้นแบบ เมื่อต้องทดสอบการค้นหาและการเปลี่ยนแปลงกับ ช่วงของค่าที่ไม่ต่อเนื่อง คุณสามารถป้อนข้อมูลด้วยหลายระเบียนได้ เช่น คุณอาจต้องการเพิ่มระเบียนภาพยนตร์หลายรายการที่มีประเภท แนวและระดับที่แตกต่างกันเพื่อทดสอบการเปรียบเทียบและการกรอง

ส่งข้อมูลเริ่มต้นไปยังตาราง Movie และ Actor

คุณสามารถใช้เทคนิคเดียวกันกับที่แนะนำในคู่มือเริ่มต้นเพื่อแทรกระเบียน 1 หรือ 2 รายการได้ ทั้งนี้ขึ้นอยู่กับขั้นตอนการสร้างต้นแบบ นั่นคือ คุณสามารถใช้ CodeLens ในส่วนขยาย VS Code เพื่อสร้าง _insert mutations ฮาร์ดโค้ดข้อมูล และเรียกใช้ mutations เหล่านั้นใน VS Code

ในที่สุด การเพิ่มระเบียนจำนวนมากในตารางโดยใช้การดำเนินการ _insertMany ก็สมเหตุสมผลกว่า ในตัวอย่างแอปรีวิวภาพยนตร์ การดำเนินการนี้จะแทรก ชุดข้อมูลเริ่มต้นใน Movie และ Actor

หากต้องการเรียกใช้การเปลี่ยนแปลงต่อไปนี้โดยใช้ส่วนขยาย Firebase ของ VS Code ในมุมมองโปรแกรมแก้ไขไฟล์ที่เหมาะสม ให้คลิกปุ่ม CodeLens Run (Production) หรือ Run (Local) ทั้งนี้ขึ้นอยู่กับว่าคุณกำลังสร้างต้นแบบด้วยบริการเวอร์ชันที่ใช้งานจริงหรือฐานข้อมูลในเครื่อง

# 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"
    }
   ])
}

ส่งข้อมูลเริ่มต้นไปยังMovieActorตารางการเข้าร่วม

หากต้องการทดสอบการค้นหาและการเปลี่ยนแปลงโดยใช้ Join และการดำเนินการที่ซับซ้อนอื่นๆ คุณสามารถ เพิ่มหลายระเบียนลงในตาราง MovieActor ได้

ในกรณีนี้ เมื่ออัปเดตหลายตารางในความสัมพันธ์ประเภทนี้ คุณจะ เพิ่มคำสั่ง @transaction เพื่อให้การอัปเดตเสร็จสมบูรณ์อย่างถูกต้องได้

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"
    }
  ])
}

เขียนการเปลี่ยนแปลงเพื่อรีเซ็ตข้อมูลเริ่มต้น

ในขณะที่สร้างต้นแบบและดำเนินการ CI/CD การรีเซ็ตข้อมูลเป็นสถานะ 0 เพื่อ เรียกใช้ชุดการทดสอบใหม่ในชุดข้อมูลใหม่จะมีประโยชน์

หากต้องการดำเนินการดังกล่าว หากโค้ดต้นแบบไม่ได้เพิ่มระเบียนลงในตาราง ให้ใช้การเปลี่ยนแปลง _upsertMany ที่ Data Connect จัดเตรียมไว้ให้

ในตัวอย่างต่อไปนี้ movie_upsertMany จะเรียกใช้ค่าเริ่มต้น เพื่ออัปเดตระเบียนภาพยนตร์ให้กลับสู่สถานะเดิม

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",
    }
   
}

การพัฒนาผลงาน: ใช้ Admin SDK เพื่อป้อนและอัปเดต

Firebase Admin SDK จะพร้อมใช้งานเมื่อคุณต้องการทำงานจากสภาพแวดล้อมที่มีสิทธิ์ นี่เป็นกรณีการใช้งานที่สำคัญเมื่อคุณต้องการโหลดหลายพันระเบียน เนื่องจากลักษณะที่สำคัญของการดำเนินการข้อมูลจำนวนมากในข้อมูลการผลิต

ติดตั้ง Firebase Admin SDK

แม้ว่าคุณจะทำงานในเครื่องเป็นหลัก Firebase ขอแนะนำให้ตั้งค่า Admin SDKเพื่อให้คุณใช้ Firebase Data Connect จากสภาพแวดล้อมที่มีสิทธิ์ รวมถึงสภาพแวดล้อมในเครื่องได้ คุณต้องตั้งค่า Admin SDK สำหรับ Node.js

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Admin SDK ในData Connect กรณีการใช้งานอื่นๆ

ทำการโหลดและอัปเดตข้อมูลการผลิตแบบเป็นกลุ่ม

API สำหรับการจัดการข้อมูลแบบกลุ่มจะสร้างการเปลี่ยนแปลง GraphQL ในนามของคุณ แทนที่จะขอให้คุณสร้างสตริง mutation {...} ด้วย executeGraphQL API ที่อธิบายไว้ก่อนหน้านี้เพื่อเพิ่มแถว 2-3 แถวในเครื่อง

ข้อดีที่สำคัญของ Administrative API คือความสามารถในการจัดการแยกกัน และนำอาร์เรย์ของข้อมูลกลับมาใช้ใหม่สำหรับโฟลว์ CI/CD หรือตั้งค่าไฟล์ข้อมูลแบบกลุ่มขนาดใหญ่สำหรับ ข้อมูลการผลิต

ข้อมูลโค้ดต่อไปนี้แสดงวิธีตั้งค่าสคริปต์ข้อมูลจำนวนมาก

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);

การพัฒนาเวอร์ชันที่ใช้งานจริง: ใช้ SQL เพื่ออัปเดตข้อมูลจำนวนมาก

เมื่อใช้สคีมาที่เสถียรในเวอร์ชันที่ใช้งานจริงและไม่ได้แก้ไขสคีมา คุณสามารถทำงานในอินสแตนซ์ Cloud SQL เพื่อจัดการการโหลดและการอัปเดตข้อมูลได้

เสียหาย

ดูคำแนะนำสำหรับ Cloud SQL สำหรับ PostgreSQL ในการนำเข้าข้อมูล

ขั้นตอนถัดไปคือ