Loading...
Loading...
Database schema migrations and change management. Covers Prisma migrations, schema versioning, rollback strategies, and safe production deployments. Trigger: When creating database migrations, when modifying schemas, when deploying database changes, when handling rollbacks.
npx skill4agent add dsantiagomj/dsmj-ai-toolkit database-migrations# 1. Modify schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String
}
# 2. Create migration
npx prisma migrate dev --name add_user_model
# Creates migration file and applies itmigrate dev# Deploy migrations (non-interactive)
npx prisma migrate deploy
# CI/CD pipeline# ❌ Never use migrate dev in production
npx prisma migrate devmigrate deploy// ✅ Adding optional field
model User {
id Int @id
email String @unique
bio String? // Existing rows get NULL
}
// ✅ Adding field with default
model User {
id Int @id
email String @unique
role String @default("USER")
createdAt DateTime @default(now())
}// Step 1: Add new field mapping to same column
model User {
id Int @id
name String
fullName String @map("name")
}
// Step 2: Update app code to use fullName
// Step 3: Remove old field
model User {
id Int @id
fullName String @map("name")
}// ❌ Direct rename (data loss)
model User {
id Int @id
fullName String // Was "name", data lost!
}// Step 1: Add default
model User {
id Int @id
name String? @default("")
}npx prisma migrate dev --name add_default_name// Step 2: Backfill NULL values
await prisma.$executeRaw`UPDATE "User" SET name = '' WHERE name IS NULL`// Step 3: Make required
model User {
id Int @id
name String @default("")
}// schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String
createdAt DateTime @default(now())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
createdAt DateTime @default(now())
}# Create migration
npx prisma migrate dev --name add_post_model
# Applies migration and generates Prisma Client// Backfill default values before making field required
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function backfillUserNames() {
// Update all NULL names to empty string
await prisma.$executeRaw`
UPDATE "User"
SET name = COALESCE(name, '')
WHERE name IS NULL
`;
console.log('Backfill complete');
}
backfillUserNames()
.catch(console.error)
.finally(() => prisma.$disconnect());# 1. Backup
pg_dump production_db > backup_$(date +%Y%m%d).sql
# 2. Deploy code (if backward compatible)
git push production main
# 3. Run migrations
npx prisma migrate deploy
# 4. Verify
npx prisma migrate statusprisma migrate devprisma migrate deploymigrate reset