ใน 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 เรียกใช้ (การใช้งานจริง) หรือ เรียกใช้ (ในเครื่อง) ในมุมมองเครื่องมือแก้ไขไฟล์ที่เหมาะสม ทั้งนี้ขึ้นอยู่กับว่าคุณกำลังสร้างต้นแบบด้วย บริการการใช้งานจริงหรือฐานข้อมูลในเครื่อง
# 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"
}
])
}
เขียนการเปลี่ยนแปลงเพื่อรีเซ็ตข้อมูลเริ่มต้น
ขณะสร้างต้นแบบและดำเนินการ 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 พร้อมให้คุณใช้งานเมื่อต้องการทำงานจากสภาพแวดล้อมที่มีสิทธิ์ นี่เป็นกรณีการใช้งานที่สำคัญเมื่อคุณต้องการโหลดระเบียนหลายพันรายการ เนื่องจากลักษณะที่สำคัญของการดำเนินการข้อมูลจำนวนมากกับข้อมูลการใช้งานจริง
ติดตั้ง Firebase Admin SDK
แม้ว่าคุณจะทำงานในเครื่องเป็นหลัก Firebase ขอแนะนำให้ตั้งค่า Admin SDK เพื่อให้คุณใช้ Firebase SQL Connect จากสภาพแวดล้อมที่มีสิทธิ์ ซึ่งรวมถึงสภาพแวดล้อมในเครื่อง คุณจะต้องตั้งค่า Admin SDKสำหรับ Node.js
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Admin SDK ในกรณีการใช้งานSQL Connect อื่นๆ
ดำเนินการโหลดและอัปเดตข้อมูลการใช้งานจริงจำนวนมาก
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",
},
{
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 เพื่อนำเข้าข้อมูล
ขั้นตอนต่อไปคืออะไร
- ดูข้อมูลเกี่ยวกับการผสานรวม Admin SDK เข้ากับ SQL Connect โปรเจ็กต์