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

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

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

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

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

    • นอกจากนี้ คุณยังใช้เครื่องมือ SQL กับอินสแตนซ์ Cloud SQL เพื่อ ทำการโหลดและการอัปเดตแบบเป็นกลุ่มได้ ตราบใดที่คุณแก้ไขข้อมูล ไม่ใช่สคีมาฐานข้อมูล การแก้ไขสคีมาฐานข้อมูลโดยตรงด้วยเครื่องมือ SQL อาจทำให้SQL 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 รายการได้ ทั้งนี้ขึ้นอยู่กับขั้นตอนการสร้างต้นแบบ นั่นคือคุณสามารถใช้ CodeLenses ในส่วนขยาย SQL Connect VS Code เพื่อสร้าง_insertการเปลี่ยนแปลง ฮาร์ดโค้ดข้อมูล และเรียกใช้การเปลี่ยนแปลงเหล่านั้นใน VS Code

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

หากต้องการเรียกใช้การเปลี่ยนแปลงต่อไปนี้โดยใช้ส่วนขยาย SQL Connect 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"
    }
  ])
}

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

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

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

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

หากต้องการดำเนินการดังกล่าว หากโค้ดต้นแบบไม่ได้เพิ่มระเบียนลงในตาราง ให้ใช้การเปลี่ยนแปลง_upsertManyที่SQL 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 SQL Connect จากสภาพแวดล้อมที่มีสิทธิ์ รวมถึงสภาพแวดล้อมในเครื่องได้ คุณต้องตั้งค่า Admin SDK สำหรับ Node.js

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Admin SDK ในSQL 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",
    // 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);

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

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

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

ขั้นตอนต่อไปคืออะไร