การจัดการ Migration และ Seeding

Migration คือการจัดการการเปลี่ยนแปลง Schema อย่างเป็นลำดับและตรวจสอบย้อนหลังได้ ส่วน Seeding คือการใส่ข้อมูลตัวอย่างหรือข้อมูลเริ่มต้นเพื่อใช้ใน Development, Test หรือ Demo

Timeline/ประวัติศาสตร์

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#fabd2f", "primaryTextColor": "#282828", "primaryBorderColor": "#b57614", "lineColor": "#7c6f64", "secondaryColor": "#83a598", "tertiaryColor": "#b8bb26", "background": "#fbf1c7", "mainBkg": "#ebdbb2", "fontFamily": "Tahoma, sans-serif"}}}%%
flowchart LR
  subgraph Era1["ยุคแก้ DB Manual / Manual Change"]
    A["ALTER TABLE ด้วยมือ
จำไม่ได้ว่าเปลี่ยนอะไร"] end subgraph Era2["ยุค Versioned Schema / Migration"] B["Migration Files
เปลี่ยน schema เป็นลำดับ"] C["Commit to Git
ทีมใช้ร่วมกัน"] end subgraph Era3["ยุค Reproducible Dev DB"] D["Seed Data
ข้อมูลตัวอย่าง"] E["Reset + Seed
สร้าง DB ใหม่ได้ซ้ำ"] end A --> B --> C --> D --> E

แนวคิดสำคัญ

ตาราง Migration vs Seeding

หัวข้อ Migration Seeding
หน้าที่ เปลี่ยน schema ใส่ข้อมูลเริ่มต้น
ตัวอย่าง add users table เพิ่ม admin user
รันเมื่อ เปลี่ยนโครงสร้าง DB เตรียม dev/test data
ควร commit ใช่ ใช่ ถ้าเป็น seed script ไม่ใช่ secret

Mermaid Diagram: Migration Workflow

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#fabd2f", "primaryTextColor": "#282828", "primaryBorderColor": "#b57614", "lineColor": "#7c6f64", "secondaryColor": "#83a598", "tertiaryColor": "#b8bb26", "background": "#fbf1c7", "mainBkg": "#ebdbb2", "fontFamily": "Tahoma, sans-serif"}}}%%
flowchart TD
  A["แก้ schema.prisma
Update schema"] --> B["migrate dev
สร้าง migration"] B --> C["Database Updated
DB เปลี่ยนตาม schema"] C --> D["Commit Migration
เก็บใน Git"] D --> E["Team Pull
ทีมดึงไปใช้"] E --> F["db seed
ใส่ข้อมูลตัวอย่าง"]

สมการคณิตศาสตร์: จำนวนขั้นตอนสร้างฐานข้อมูลใหม่

T=M+S

Code Example

# สร้าง migration หลังแก้ schema.prisma
npx prisma migrate dev --name add_users_table

# reset database และรัน migration ใหม่
npx prisma migrate reset

# รัน seed script
npx prisma db seed
// prisma/seed.ts
// Seed ข้อมูลตัวอย่างสำหรับ development
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  await prisma.user.createMany({
    data: [
      { name: 'Ana', email: 'ana@example.com' },
      { name: 'Bob', email: 'bob@example.com' }
    ],
    skipDuplicates: true
  });
}

main()
  .catch(error => {
    console.error(error);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

// ตัวอย่างการใช้งาน:
// เพิ่ม config seed ใน package.json แล้วรัน npx prisma db seed
{
  "prisma": {
    "seed": "ts-node prisma/seed.ts"
  }
}

กิจกรรมท้ายบท

  1. เพิ่ม model User ใน schema.prisma
  2. สร้าง migration ชื่อ add_users_table
  3. สร้าง seed file เพิ่มผู้ใช้ตัวอย่าง
  4. อธิบายขั้นตอนที่ทีมต้องทำหลัง pull migration ใหม่

กลับสัปดาห์ที่ 11