Aturan migrasi database — zero downtime, immutability, dan format file.
Melengkapi Engineering Supreme Law Section 5.
================================================================
================================================================
Format: YYYYMMDDHHMMSS_deskripsi_singkat.{sql|py|ts}
Contoh: 20260418120000_add_user_status_column.sql
================================================================
================================================================
================================================================
================================================================
Jika ingin mengubah nama kolom dari first_name ke full_name:
full_name baru (nullable). Jangan hapus yang lama.first_name lama.================================================================
================================================================ Setiap migrasi wajib bisa dijalankan ulang tanpa error (idempotent).
-- UP
ALTER TABLE users ADD COLUMN IF NOT EXISTS status VARCHAR(20) DEFAULT 'active';
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_status ON users(status);
-- DOWN
DROP INDEX IF EXISTS idx_users_status;
ALTER TABLE users DROP COLUMN IF EXISTS status;
(Catatan: CONCURRENTLY penting agar tabel tidak ter-lock saat pembuatan index)
================================================================
================================================================
"""add user status column
Revision ID: a1b2c3d4e5f6
Revises: 9z8y7x6w5v4u
Create Date: 2026-04-18 12:00:00.000000
"""
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column('users', sa.Column('status', sa.String(20), server_default='active'))
op.create_index('idx_users_status', 'users', ['status'])
def downgrade():
op.drop_index('idx_users_status', table_name='users')
op.drop_column('users', 'status')
================================================================
================================================================
main. Buat file migrasi baru untuk perbaikan.DROP TABLE atau DROP COLUMN secara langsung tanpa melewati fase Expand-Contract.down() / downgrade()).ALTER TYPE) langsung di Postgres lama, buat type baru dan update.