การทำ Data Migration และ Seeder: คู่มือสำหรับ Developer
ถ้าพูดถึงการพัฒนาแอปพลิเคชันที่เชื่อมต่อกับ Database หนึ่งในความยุ่งยากที่สุดคือการจัดการ Database structure ที่เปลี่ยนไปตามฟีเจอร์ใหม่ๆ ที่เพิ่มเข้ามา เช่น เพิ่มตาราง (Table) เปลี่ยนชนิดข้อมูล (Data type) หรือลบฟิลด์ (Field) ออกไป และแน่นอนว่า การเติมข้อมูลตัวอย่างหรือข้อมูลพื้นฐานก็ไม่ใช่เรื่องง่าย
ที่นี่เองที่ Data Migration และ Seeder จะมาช่วยให้ชีวิต Developer ง่ายขึ้น! 🎉
Data Migration คืออะไร?
Migration ก็คือกระบวนการ "เขียนโค้ด" เพื่อปรับเปลี่ยน Database structure โดยเฉพาะ ไม่ว่าจะเป็นการ db up (เพิ่มโครงสร้างใหม่) หรือ db down (ลบหรือย้อนโครงสร้างกลับ)
ตัวช่วยนี้ออกแบบมาเพื่อลดข้อผิดพลาดจากการแก้ไข Database structure ด้วยมือ (Manual) ซึ่งอาจทำให้เกิดปัญหาตามมา เช่น ลืมอัปเดตโครงสร้างบางส่วน หรือทีม Developer คนอื่นๆ ในทีมไม่รู้ว่ามีการเปลี่ยนแปลงอะไรบ้าง
Seeder คืออะไร?
Seeder ใช้สำหรับเติมข้อมูลใน Database โดยอัตโนมัติ เช่น ข้อมูล mock สำหรับการทดสอบ หรือข้อมูลพื้นฐานที่ระบบต้องใช้ เช่น ชื่อประเทศ, สิทธิ์ผู้ใช้งาน (Roles) หรือสินค้าในร้านค้า
ถ้าคุณเคยเสียเวลาเติมข้อมูลเดิมๆ เพื่อทดสอบระบบ Seeder จะช่วยประหยัดเวลาได้มาก และยังช่วยลดข้อผิดพลาดที่เกิดจากการพิมพ์ข้อมูลผิดได้ด้วย
Use Case ของ db up และ db down
เมื่อไหร่เราจะใช้ db up
- เพิ่มฟีเจอร์ใหม่
เช่น คุณต้องการเพิ่มระบบเก็บคะแนน (Points system) สำหรับผู้ใช้งาน อาจต้องเพิ่มตารางใหม่ชื่อpoints
หรือเพิ่มคอลัมน์total_points
ในตารางusers
- ปรับปรุงระบบเดิมให้ดียิ่งขึ้น
เช่น เปลี่ยนชนิดข้อมูลของคอลัมน์จากSTRING
เป็นTEXT
เพราะข้อมูลมีความยาวมากขึ้น - สร้างฐานข้อมูลใหม่ในสภาพแวดล้อมอื่นๆ
เช่น คุณต้องการสร้าง Database structure เดิมทั้งหมดในระบบ staging หรือ production
เมื่อไหร่เราจะใช้ db down
- Rollback การเปลี่ยนแปลงที่ผิดพลาด
เช่น เพิ่มตารางผิด หรือคอลัมน์ใหม่ไม่จำเป็นแล้ว เราสามารถdb down
เพื่อลบโครงสร้างนั้นออก - ทดลองโค้ดในสภาพแวดล้อม Development
เช่น คุณอาจต้องการลองเพิ่ม/ลบ Database structure หลายครั้งเพื่อทดสอบ
ในทางกลับกัน...เมื่อ Rollback Code แล้ว Database ล่ะ?
"อ้าว! แล้ว Database ล่ะ จะ Rollback ยังไง?"
นี่คือจุดที่ Migration มีบทบาทสำคัญ!
การใช้ Migration ทำให้เราสามารถ Rollback Database ได้ด้วยคำสั่ง db down
ซึ่งจะย้อนการเปลี่ยนแปลงกลับไปยังสถานะก่อนหน้า เช่น ลบตารางที่สร้างใหม่ หรือคืนค่าโครงสร้างเดิมกลับมา
ข้อดี-ข้อเสียของ Data Migration และ Seeder
ข้อดีของ Data Migration
- สะดวก: ไม่ต้องแก้ Database structure ด้วย SQL ทีละคำสั่ง
- ลดความผิดพลาด: Migration Script ถูกทดสอบแล้ว และสามารถแชร์ให้ทีม Developer ใช้ได้
- จัดการเวอร์ชันได้: สามารถ Rollback หรือย้อนกลับไปยังสถานะก่อนหน้าได้
ข้อเสียของ Data Migration
- ซับซ้อนในโครงการใหญ่: Migration หลายไฟล์อาจทำให้การจัดการยุ่งยาก
- ต้องระวังข้อมูลจริง (Production): การรัน Migration ที่ผิดพลาดอาจกระทบกับข้อมูลสำคัญ
ข้อดีของ Seeder
- สะดวกสำหรับการทดสอบ: เติมข้อมูล mock ได้เร็ว
- ลดข้อผิดพลาด: ไม่ต้องพิมพ์ข้อมูลด้วยมือ
ข้อเสียของ Seeder
- ไม่เหมาะกับ Production: Seed Data อาจทับข้อมูลจริงในระบบ
- ข้อมูลที่เยอะเกินไป: Seeder ที่เติมข้อมูลมากเกินไปอาจทำให้ Database หน่วง
ตัวอย่างการทำ db up / db down
สร้าง Migration สำหรับเพิ่มตาราง users
npx sequelize-cli migration:generate --name create-users-table
ไฟล์ที่สร้างขึ้น (ใน /migrations
) จะมีโครงสร้างประมาณนี้:
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
},
name: {
type: Sequelize.STRING,
allowNull: false,
},
email: {
type: Sequelize.STRING,
unique: true,
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
});
},
down: async (queryInterface) => {
await queryInterface.dropTable('Users');
},
};
รัน db up
เพิ่มตารางใน Database:
npx sequelize-cli db:migrate
รัน db down
ลบตารางที่เพิ่งเพิ่มไป:
npx sequelize-cli db:migrate:undo
ตัวอย่างการทำ Seeder
สร้าง Seeder สำหรับเติมข้อมูลผู้ใช้งานตัวอย่าง
npx sequelize-cli seed:generate --name demo-users
ไฟล์ Seeder จะหน้าตาแบบนี้:
module.exports = {
up: async (queryInterface) => {
await queryInterface.bulkInsert('Users', [
{
name: 'John Doe',
email: '[email protected]',
createdAt: new Date(),
updatedAt: new Date(),
},
{
name: 'Jane Smith',
email: '[email protected]',
createdAt: new Date(),
updatedAt: new Date(),
},
]);
},
down: async (queryInterface) => {
await queryInterface.bulkDelete('Users', null, {});
},
};
รัน Seeder
เติมข้อมูลใน Database:
npx sequelize-cli db:seed:all
Rollback Seeder
ลบข้อมูลที่ Seeder เคยเพิ่ม:
npx sequelize-cli db:seed:undo
สรุป
Data Migration และ Seeder เป็นเครื่องมือที่ช่วยให้ Developer จัดการ Database structure และข้อมูลใน Database ได้ง่ายขึ้น ไม่ว่าจะเป็นการเพิ่มโครงสร้างใหม่ ลบโครงสร้างเก่า เติมข้อมูล mock หรือ Rollback การเปลี่ยนแปลง ทุกอย่างทำได้ด้วยคำสั่งง่ายๆ
แต่สิ่งสำคัญคือต้องใช้อย่างระมัดระวัง โดยเฉพาะกับระบบ Production เพื่อป้องกันความผิดพลาดที่อาจเกิดขึ้นกับข้อมูลจริง
"ลองเริ่มใช้งาน Migration และ Seeder ในโปรเจกต์ถัดไปของคุณ แล้วคุณจะรู้ว่ามันช่วยประหยัดเวลาได้แค่ไหน!"