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

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

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

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

# 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

หากต้องการทดสอบการค้นหาและการเปลี่ยนแปลงโดยใช้การรวมและการดำเนินการที่ซับซ้อนอื่นๆ คุณสามารถเพิ่มระเบียนหลายรายการลงในตาราง 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 (one-to-many)
# 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" }
      }
    ]
  })
}
# Nested insert for User and Profile (one-to-one)
mutation {
  user_insert(data: {
    id: "user-uuid-123",
    name: "Alice",
    profile_on_user: {
      bio: "Avid moviegoer and critic."
    }
  })
}

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

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

หากต้องการทำเช่นนั้น ให้ใช้การเปลี่ยนแปลง _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 พร้อมให้คุณใช้งานเมื่อต้องการทำงานจากสภาพแวดล้อมที่มีสิทธิ์ นี่เป็น Use Case ที่สำคัญเมื่อคุณต้องการโหลดระเบียนหลายพันรายการ เนื่องจากลักษณะที่สำคัญของการดำเนินการข้อมูลจำนวนมากกับข้อมูลในสภาพแวดล้อมจริง

ติดตั้ง Firebase Admin SDK

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

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

โหลดและอัปเดตข้อมูลจำนวนมากในสภาพแวดล้อมจริง

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

ข้อดีที่สำคัญของ 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 เพื่อนำเข้าข้อมูล

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