1. ภาพรวมของกลไกการย้ายถ่าย
1.1 แนวคิดและบทบาทของการย้ายถ่าย
การย้ายฐานข้อมูลคือกระบวนการที่การปรับปรุงโมเดลของข้อมูลให้สอดคล้องกับโครงสร้างของฐานข้อมูลที่สำคัญสำหรับความต่อเนื่องของข้อมูล ภายในการพัฒนาแอปพลิเคชันเวอร์ชันใหม่ ๆ โมเดลข้อมูลโดยทั่วไปจะปรับเปลี่ยน เช่น เพิ่มหรือลบฟิลด์ หรือแก้ไขดัชนี การย้ายถ่ายช่วยให้นักพัฒนาสามารถจัดการกับการเปลี่ยนแปลงเหล่านี้ในรูปแบบที่ถูกดำเนินการเวอร์ชันและระบบ เพื่อให้มั่นใจว่าโครงสร้างของฐานข้อมูลและโมเดลข้อมูลสอดคล้องกันไป
ในการพัฒนาเว็บที่ทันสมัย กลไกการย้ายถ่ายนี้มอบให้ประโยชน์ต่อต่อไปนี้:
- การควบคุมเวอร์ชัน: แฟ้มย้ายสามารถติดตามประวัติการเปลี่ยนแปลงของโครงสร้างของฐานข้อมูลทำให้สะดวกสำหรับการย้อนกลับและเข้าใจการเปลี่ยนแปลงในแต่ละเวอร์ชัน
- การประยุกต์ใช้อัตโนมัติ: ผ่านประโยชน์ของกลไกการย้ายถ่าย การประยุกต์ฐานข้อมูลและการอัปเดตสามารถทำได้อัตโนมัติลดความเป็นไปได้ของการแทรกรด้วยตนเองและความเสี่ยงของข้อผิดพลาด
- การทำงานร่วมกันของทีม: แฟ้มย้ายรองรับให้ทีมสมาชิกใช้โครงสร้างของฐานข้อมูลที่สะท้อนเป็นอย่างดีในสภาพแวดล้อมการพัฒนาที่แตกต่างกันทำให้การพัฒนาร่วมกันง่ายขึ้น
1.2 คุณสมบัติการย้ายถ่ายของเฟรมเวิร์ค ent
การบูรณาการของเฟรมเวิร์ค ent
กับกลไกการย้ายถ่าย มอบให้มีคุณสมบัติต่อไปนี้:
- การเขียนอะคลารราตีฟ: นักพัฒนาจำเป็นต้องเน้นที่การเขียนของอิทธีมองของเอนติตี้ซึ่งเฟเรมเวิร์คเอ็นท์จะจัดการการแปลงเอนติตี้ไปสู่ตารางฐานข้อมูล
- การย้ายถ่ายอัตโนมัติ: เอ็นท์สามารถสร้างและอัพเดทโครงสร้างของตารางฐานข้อมูลโดยอัตโนมัติโดยไม่จำเป็นต้องเขียนคำสั่ง DDL ด้วยตนเอง
- การควบคุมอย่างยืดหยุ่น: เอ็นท์มีตัวเลือกการกำหนดแบบสนับสนุนความต้องการของการย้ายถ่ายที่แตกต่างกันเช่น แบบเป็นหรือไม่เป็นข้อจำกัดกุญแจต่างๆ และการสร้างหรือไม่สร้างสำหรับรหัสไอดีที่เป็นสิ่งหลักในระดับสากล
2. การนำเสนอการย้ายถ่ายอัตโนมัติ
2.1 หลักการพื้นฐานของการย้ายถ่ายอัตโนมัติ
คุณสมบัติการย้ายถ่ายอัตโนมัติของเฟรมเวิร์ค ent
อ้างอิงถึงแฟ้มนิยามสเคีม่า ไฟล์(ที่พบได้โดยทั่วไปในไดเรคทอรี ent/schema) เพื่อสร้างโครงสร้างของฐานข้อมูล หลังจากพัฒนาเอนทิตี้และความสัมพันธ์ ent
จะตรวจสอบโครงสร้างที่มีอยู่ในฐานข้อมูลและสร้างการดำเนินการที่สอดคล้องกันเช่น สร้างตาราง เพิ่มหรือแก้ไขคอลัมน์ สร้างดัชนี ฯลฯ
และกับหลักการงานอัตโนมัติของ ent
ทำงานใน "โหมดการเพิ่มเติม" โดยค่าเริ่มต้นเฉพาะอยากอัพเดตช่องงใหม่ ให้ถูก เพิ่มดัชนีใหม่ หรือเพิ่มคอลัมน์ในตาราง และไม่ลบตารางหรือคอลัมน์ที่มีอยู่ การออกแบบนี้เป็นประโยชน์บรรทัดการข้อมูลที่เสี่ยงแพลดด้วยตนเอง และทำให้ง่ายในการขยายโครงสร้างฐานข้อมูลในรูปแบบการดำเนินงาน
2.2 การใช้การย้ายถ่ายอัตโนมัติ
ขั้นตอนพื้นฐานในการใช้การย้ายถ่ายอัตโนมัติของ ent
คือดังนี้:
package main
import (
"context"
"log"
"ent"
)
func main() {
client, err := ent.Open("mysql", "root:pass@tcp(localhost:3306)/test")
if err != nil {
log.Fatalf("Failed to connect to MySQL: %v", err)
}
defer client.Close()
ctx := context.Background()
// ทำการย้ายไปสร้างหรืออัพเดตโครงสร้างฐานข้อมูล
if err := client.Schema.Create(ctx); err != nil {
log.Fatalf("Failed to create database schema: %v", err)
}
}
ในโค้ดข้างต้น ent.Open
ทำหน้าที่ในการเชื่อมต่อกับฐานข้อมูลและการส่งกลับอินสแตนซ์ลูกค้าในขณะที่ client.Schema.Create
ดำเนินการย้ายอัตโนมัติจริง
3. การใช้การย้ายถ่ายในลักษณะของอัพพลิเคชันอย่างประสูติน
3.1 การลบคอลัมน์และดัชนี
เป็นที่บางกรณี เราอาจจะต้องการลบคอลัมน์หรือดัชนีที่ไม่จำเป็นอยู่จากโครงสร้างฐานข้อมูล ในขณะนั้น เราสามารถใช้ตัวเลือก WithDropColumn
และ WithDropIndex
ตัวอย่างเช่น:
// เรียกกิจกรรมย้ายร่วมกับตัวเลือกที่จะดรอปคอลัมน์และดัชนี
err = client.Schema.Create(
ctx,
migrate.WithDropIndex(true),
migrate.WithDropColumn(true),
)
ตัวอย่างโค้ดด้านบนเปิดใช้การตั้งค่าให้ลบคอลัมน์และดัชนี ตอนการทำการย้ายถ่ายอัตโนมัติ ent
จะลบคอลัมน์และดัชนีที่ไม่มีอยู่ในข้อจำกัดของรูปนิยามเมื่อดำเนินการย้าย
3.2 รหัสไอดีที่เป็นสิ่งหลักในระดับสายละกับ
โดยค่าเริ่มต้น คีย์หลักในฐานข้อมูล SQL จะเริ่มต้นจาก 1 สำหรับแต่ละตาราง และประเภทอิทธ์ต่าง ๆ อาจจะมีการใช้ขงดเดียร้าไอดี่ที่เดียวกัน เกินนี้เช่นใช้กับกราฟคิวแอล อาจจะจำเป็นต้องมีความจำเป็นของความเป็นเอกลักษณ์สำหรับไอดีของออปเจ็คของพิกัลตันอิทธต์ที่แตกต่างกัน ใน ent
สามารถกำหนดค่าได้โดยใช้ตัวเลือก WithGlobalUniqueID
:
// ทำการย้ายโดยมีการจัดหาค่าไอดีสำหรับแต่ละอีนทิตี้
if err := client.Schema.Create(ctx, migrate.WithGlobalUniqueID(true)); err != nil {
log.Fatalf("Failed to create the database schema: %v", err)
}
หลังจากเปิดใช้ ตัวเลือก WithGlobalUniqueID
ent
จะมอบหมายรหัสรัศมีขนาด 2^32 ให้กับแต่ละอิทธต์ในตารางที่มีชื่อว่า ent_types
เพื่อให้เกิดความเป็นเอกลักษณ์สำหรับแต่ละอีนทิตี้อย่างโลกเสมอ
3.3 โหมดออฟไลน์
โหมดออฟไลน์ช่วยให้สามารถเขียนการเปลี่ยนแปลงแบบ schema ลงใน io.Writer
แทนการทำงานโดยตรงบนฐานข้อมูล มันเป็นประโยชน์สำหรับการทดสอบคำสั่ง SQL ก่อนที่การเปลี่ยนแปลงจะมีผล หรือสำหรับสร้างสคริปต์ SQL เพื่อทำการประมวลผลด้วยตนเอง ตัวอย่างเช่น:
// บันทึกการเปลี่ยนแปลงการโยกย้ายไปยังไฟล์
f, err := os.Create("migrate.sql")
if err != nil {
log.Fatalf("ล้มเหลวในการสร้างไฟล์การโยกย้าย: %v", err)
}
defer f.Close()
if err := client.Schema.WriteTo(ctx, f); err != nil {
log.Fatalf("ล้มเหลวในการพิมพ์การเปลี่ยนแปลงของ schema ในฐานข้อมูล: %v", err)
}
โค้ดนี้จะเขียนการเปลี่ยนแปลงการโยกย้ายไปยังไฟล์ที่ชื่อ migrate.sql
ในการปฏิบัติของนักพัฒนา สามารถเลือกที่จะพิมพ์โดยตรงไปยังการเอาออกมามองหรือเขียนไปยังไฟล์เพื่อสำรองไว้หรือเก็บบันทึกได้โดยตรง
4. การสนับสนุนคีย์ลูกศรภายนอกและการเชื่อมต่อกำหนดเอง
4.1 เปิดหรือปิดคีย์ลูกศรภายนอก
ใน Ent, คีย์ลูกศรภายนอกถูกนำมาใช้โดยการกำหนดความสัมพันธ์ (edges) ระหว่าง entities, และความสัมพันธ์คีย์ลูกศรภายนอกนี้ถูกสร้างอัตโนมัติที่ระดับฐานข้อมูลเพื่อให้ความสมบูรณ์และคงวิธีการข้อมูล อย่างไรก็ตาม ในสถานการณ์บางส่วน เช่น เพื่อปรับปรุงประสิทธิภาพหรือเมื่อฐานข้อมูลไม่รองรับคีย์ลูกศรภายนอก คุณอาจเลือกที่จะปิดการใช้งาน
เพื่อเปิดหรือปิดการใช้งานคำสั่งตรวจสอบคีย์ลูกศรภายนอกในการโยกย้าย คุณสามารถควบคุมได้ผ่านตัวเลือกการกำหนด WithForeignKeys
ดังนี้:
// เปิดใช้งานคีย์ลูกศรภายนอก
err = client.Schema.Create(
ctx,
migrate.WithForeignKeys(true),
)
if err != nil {
log.Fatalf("ล้มเหลวในการสร้างทรัพยากรของ schema ด้วยคีย์ลูกศรภายนอก: %v", err)
}
// ปิดการใช้งานคีย์ลูกศรภายนอก
err = client.Schema.Create(
ctx,
migrate.WithForeignKeys(false),
)
if err != nil {
log.Fatalf("ล้มเหลวในการสร้างทรัพยากรของ schema โดยไม่มีคีย์ลูกศรภายนอก: %v", err)
}
ตัวเลือกการกำหนดนี้จะต้องถูกส่งผ่านเมื่อเรียกใช้ Schema.Create
และมันกำหนดว่าจะรวมเงื่อนไขคีย์ลูกศรภายนอกใน DDL ที่ได้รับการสร้างโดยการกำหนดค่าที่ระบุ
4.2 การประยุกต์ใช้ก็อกของการโยกย้าย
ก็อกของการโยกย้ายคือตรรกะที่นำมาเอาและประมวลผลในขั้นตอนต่าง ๆ ของการปฏิบัติการโยกย้าย มันเป็นอย่างมากสำหรับการปฏิบัติโลจิกที่เฉพาะเจาะจงที่ฐานข้อมูลก่อนหลังการโยกย้าย เช่น การตรวจสอบผลลัพธ์การโยกย้าย และการเติมข้อมูลล่วงหน้าในการตัวอย่างง่าย ๆ ของการประยุกต์ก็อกการโยกย้าย:
func customHook(next schema.Creator) schema.Creator {
return schema.CreateFunc(func(ctx context.Context, tables ...*schema.Table) error {
// โลจิกที่ปรับการปฏิบัติก่อนการโยกย้าย
// เช่น การบันทึก, ตรวจสอบเงื่อนไขบางอย่าง เป็นต้น
log.Println("โลจิกก่อนการโยกย้าย")
// เรียกใช้ก็อกถัดไปหรือโลจิกโยกย้ายเริ่มต้น
err := next.Create(ctx, tables...)
if err != nil {
return err
}
// โลจิกที่ปรับการปฏิบัติหลังการโยกย้าย
// เช่น การทำความสะอาด, การเติมข้อมูล, การตรวจสอบความปลอดภัย เป็นต้น
log.Println("โลจิกหลังการโยกย้าย")
return nil
})
}
// การใช้ก็อกของการโยกย้ายที่ปรับการโยกย้าย
err := client.Schema.Create(
ctx,
schema.WithHooks(customHook),
)
if err != nil {
log.Fatalf("ข้อผิดพลาดในการประยุกต์ใช้ก็อกการโยกย้ายกำหนดเอง: %v", err)
}
บั้งอาจารย์เป็นเครื่องมือที่มีพลังและจำเป็นสำหรับการโยกย้ายที่ซับซ้อน ซึ่งจะให้คุณความสามารถในการควบคุมพฤติกรรมการโยกย้ายฐานข้อมูลโดยตรงเมื่อจำเป็น
5. การโยกย้ายเวอร์ชัน
5.1 การแนะนำในการโยกย้ายเวอร์ชัน
การโยกย้ายเวอร์ชันเป็นแนวแกนสำหรับการจัดการการโยกย้ายฐานข้อมูล ทำให้นักพัฒนาสามารถแบ่งการเปลี่ยนแปลงโครงสร้างฐานข้อมูลเป็นหลายเวอร์ชัน แต่ละเวอร์ชันมีคำสั่งปรับเปลี่ยนฐานข้อมูลเฉพาะของมัน ต่อมายิ่ง Auto Migration, การโยกย้ายเวอร์ชันให้ควบคุมแม่นยำมากขึ้น แน่นอนทำให้การเปลี่ยนแปลงโครงสร้างฐานข้อมูลสามารถติดตามและทำกลับได้
ข้อได้เปรียบหลักของการโยกย้ายเวอร์ชันคือการสนับสนุนการโยกย้ายไปข้างหน้าและข้างหลัง (เช่น อัพเกรดหรือดาวน์เกรด) ทำให้นักพัฒนาสามารถใช้, ย้อนกลับหรือข้ามคำสั่งเฉพาะตามที่ต้องการ เมื่อทำงานร่วมกับทีม, การโยกย้ายเวอร์ชันทำให้แน่ใจว่าแต่ละสมาชิกทำงานกับโครงสร้างฐานข้อมูลเดียวกัน ลดปัญหาที่เกิดขึ้นจากความไม่สอดคล้องกัน
Auto migration มักจะไม่สามารถทำกลับ สร้างและประมวลผลคำสั่ง SQL เพื่อเข้ากับสถานะล่าสุดของ entities โดยส่วนใหญ่ถูกนำมาใช้อย่างไม่สมบูรณ์ในขั้นตอนการพัฒนาหรือโครงการขนาดเล็ก
5.2 การใช้การโยกย้ายเวอร์ชัน
1. การติดตั้งเครื่องมือ Atlas
ก่อนใช้งานการย้ายข้อมูลเวอร์ชัน คุณจำเป็นต้องติดตั้งเครื่องมือ Atlas
ลงในระบบของคุณ Atlas
เป็นเครื่องมือสำหรับการย้ายข้อมูลที่รองรับระบบฐานข้อมูลหลายระบบ มีคุณลักษณะที่มีประสิทธิภาพสำหรับการจัดการการเปลี่ยนแปลงโครงสร้างฐานข้อมูล
macOS + Linux
curl -sSf https://atlasgo.sh | sh
Homebrew
brew install ariga/tap/atlas
Docker
docker pull arigaio/atlas
docker run --rm arigaio/atlas --help
Windows
https://release.ariga.io/atlas/atlas-windows-amd64-latest.exe
2. สร้างไฟล์ย้ายข้อมูลโดยใช้นิยาม Entity ปัจจุบัน
atlas migrate diff migration_name \
--dir "file://ent/migrate/migrations" \
--to "ent://ent/schema" \
--dev-url "docker://mysql/8/ent"
3. ไฟล์ย้ายข้อมูลแอปพลิเคชัน
เมื่อไฟล์ย้ายข้อมูลถูกสร้างขึ้นแล้ว สามารถนำไปใช้กับระบบพัฒนา ทดสอบ หรือการผลิตได้ โดยทั่วไปแล้ว คุณจะใช้ไฟล์ย้ายข้อมูลเหล่านี้กับฐานข้อมูลระบบพัฒนาหรือการทดสอบเพื่อให้แน่ใจว่าพวกเขาทำงานตามที่คาดหวัง จากนั้น ขั้นตอนย้ายข้อมูลเดียวกันจะถูกดำเนินการในสภาพแวดล้อมการผลิต
atlas migrate apply \
--dir "file://ent/migrate/migrations" \
--url "mysql://root:pass@localhost:3306/example"
ใช้คำสั่ง atlas migrate apply
ระบุไดเรกทอรีไฟล์ย้ายข้อมูล (--dir
) และ URL ของฐานข้อมูลเป้าหมาย (--url
) เพื่อนำไฟล์ย้ายข้อมูลไปใช้งาน