Migrer une base PostgreSQL avec Drizzle sans interruption de service en 2026.
Voir notre guide Drizzle migrations.
Patterns dangereux à éviter
- DROP COLUMN avec données — l’ancienne version d’app crash
- RENAME COLUMN — l’ancienne version ne trouve plus le nom
- ALTER COLUMN TYPE non compatible (varchar→int)
- ADD COLUMN NOT NULL sans default sur grosse table
- CREATE INDEX sans CONCURRENTLY (bloque les writes)
Pattern : ajouter une colonne
- Migration 1 : ADD COLUMN nullable (compatible ancienne app)
- Déployer nouvelle version app qui écrit la colonne
- Backfill data pour anciennes lignes :
UPDATE table SET col = 'default' - Migration 2 : ALTER COLUMN SET NOT NULL
Pattern : renommer une colonne
- Migration 1 : ADD COLUMN new_name + trigger qui copie old_name → new_name
- Backfill data
- Déployer nouvelle version app qui lit/écrit new_name
- Migration 2 : DROP COLUMN old_name + DROP TRIGGER
Pattern : changer un type
- Migration 1 : ADD COLUMN new_col avec nouveau type
- Trigger qui sync ancien → nouveau
- App lit/écrit nouveau
- Drop ancien
Index sans bloquer
-- Pas
CREATE INDEX users_email_idx ON users(email);
-- Mais
CREATE INDEX CONCURRENTLY users_email_idx ON users(email);Drizzle-kit ne génère pas CONCURRENTLY automatiquement. Éditez le SQL généré pour les grosses tables.
Tester la migration
- En staging avec un dump prod récent
- Mesurer la durée et le lock impact
- Vérifier compat ancienne version app simultanément