| name | database-migration |
| description | Manage database schema changes with version control. Use when modifying DB schema, adding tables/columns, or setting up new projects. Covers Prisma, Drizzle, and migration best practices. |
| allowed-tools | Read, Glob, Grep, Edit, Write, Bash |
| license | MIT |
| metadata | {"author":"antigravity-team","version":"1.0"} |
Database Migration
데이터베이스 스키마 변경을 버전 관리하는 스킬입니다.
Core Principle
"DB 스키마도 코드처럼 버전 관리한다."
"수동으로 ALTER TABLE 치는 순간, 협업이 망가진다."
Rules
| 규칙 | 상태 | 설명 |
|---|
| 마이그레이션 파일 생성 | 🔴 필수 | 수동 SQL 실행 금지 |
| 롤백 가능 | 🔴 필수 | down migration 필수 |
| 순차 실행 | 🔴 필수 | 마이그레이션 순서 보장 |
| 프로덕션 백업 | 🔴 필수 | 마이그레이션 전 백업 |
Prisma (권장)
초기 설정
npm install prisma @prisma/client
npx prisma init
스키마 정의
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
마이그레이션 워크플로우
npx prisma migrate dev --name add_user_table
ls prisma/migrations/
npx prisma migrate deploy
npx prisma generate
마이그레이션 파일 구조
prisma/
├── schema.prisma
└── migrations/
├── 20240101000000_init/
│ └── migration.sql
├── 20240102000000_add_user_table/
│ └── migration.sql
└── migration_lock.toml
마이그레이션 명령어
npx prisma migrate dev --name <migration_name>
npx prisma migrate deploy
npx prisma migrate status
npx prisma migrate reset
Drizzle ORM
초기 설정
npm install drizzle-orm postgres
npm install -D drizzle-kit
스키마 정의
import { pgTable, serial, text, timestamp, boolean, integer } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
email: text('email').notNull().unique(),
name: text('name'),
createdAt: timestamp('created_at').defaultNow(),
updatedAt: timestamp('updated_at').defaultNow(),
});
export const posts = pgTable('posts', {
id: serial('id').primaryKey(),
title: text('title').notNull(),
content: text('content'),
published: boolean('published').default(false),
authorId: integer('author_id').( users.),
: ().(),
: ().(),
});
drizzle.config.ts
import type { Config } from 'drizzle-kit';
export default {
schema: './src/db/schema.ts',
out: './drizzle',
driver: 'pg',
dbCredentials: {
connectionString: process.env.DATABASE_URL!,
},
} satisfies Config;
마이그레이션 명령어
npx drizzle-kit generate:pg
npx drizzle-kit push:pg
npx drizzle-kit studio
마이그레이션 Best Practices
1. 작은 단위로 마이그레이션
ALTER TABLE users ADD COLUMN age INT;
ALTER TABLE users ADD COLUMN address TEXT;
ALTER TABLE users DROP COLUMN old_field;
CREATE TABLE new_table (...);
DROP TABLE old_table;
ALTER TABLE users ADD COLUMN age INT;
ALTER TABLE users ADD COLUMN address TEXT;
2. 안전한 컬럼 추가
ALTER TABLE users ADD COLUMN status TEXT NOT NULL;
ALTER TABLE users ADD COLUMN status TEXT NOT NULL DEFAULT 'active';
ALTER TABLE users ADD COLUMN status TEXT;
UPDATE users SET status = 'active' WHERE status IS NULL;
ALTER TABLE users ALTER COLUMN status SET NOT NULL;
3. 안전한 컬럼 삭제
ALTER TABLE users DROP COLUMN old_field;
4. 인덱스 추가
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
롤백 전략
Prisma 롤백
npx prisma migrate resolve --rolled-back <migration_name>
npx prisma migrate reset
수동 롤백 스크립트
ALTER TABLE users DROP COLUMN status;
CI/CD 통합
GitHub Actions
name: Database Migration
on:
push:
branches: [main]
paths:
- 'prisma/**'
jobs:
migrate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run migrations
run: npx prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
마이그레이션 검증
jobs:
validate-migration:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15
env:
POSTGRES_PASSWORD: test
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- name: Run migrations on test DB
run: npx prisma migrate deploy
env:
DATABASE_URL: postgresql://postgres:test@localhost:5432/test
프로덕션 체크리스트
마이그레이션 전
마이그레이션 중
마이그레이션 후
Workflow
개발 시
1. 스키마 파일 수정 (schema.prisma)
2. npx prisma migrate dev --name <description>
3. 생성된 SQL 확인
4. Git 커밋 (스키마 + 마이그레이션 파일)
배포 시
1. PR 머지
2. CI에서 npx prisma migrate deploy 실행
3. 프로덕션 확인
4. (문제 시) 롤백 실행
Checklist
References