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

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

ต้องทำอะไรต่อ