Migrările versionate înlocuiesc SQL manual scris pe fiecare mediu. Echipa trebuie să poată rula `migrate` pe local, staging și producție cu același rezultat, astfel încât schema să fie singura sursă de adevăr partajată. Discuția acoperă ordinea operațiilor, rollback realist pe date reale și adăugarea coloanelor pe tabele deja populate fără downtime neplanificat.
Preferă migrări atomice: o coloană, un index, un tabel. Metoda `down()` trebuie să anuleze `up()` când e sigur; pe tabele mari, drop column poate dura — uneori rollback e doar teoretic. Nu edita migrări deja rulate pe producție; adaugă migrări noi corrective. Tabelul `migrations` este jurnalul oficial; forțarea manuală a stării fără a înțelege ordinea poate lăsa colegii cu migrări „Pending” imposibil de reconciliat.
Adaugă coloana nullable, backfill cu job sau query, apoi migrare separată care setează NOT NULL și default. Saltul direct la NOT NULL fără default eșuează pe rânduri existente. Default-uri la nivel DB versus aplicație trebuie aliniate. Pentru coloane calculate, uneori e mai sigur un trigger sau o coloană virtuală decât backfill sincron în migrare pe milioane de rânduri.
Date demo stau în seeders, nu în migrări — migrările definesc structura, seeders populează medii non-producție. `db:seed --class` izolează seederele grele. Nu seed-ui date personale reale; factories generează volume pentru test. Pe producție, seederele rulează rar și doar pentru date de referință idempotente (roluri, categorii), nu pentru conținut fictiv masiv.
Rulează migrările ca pas explicit în deploy înainte de trafic pe cod nou care depinde de coloană. Migrările care blochează tabelul planifică fereastră. Comanda `schema:dump` poate reduce istoricul migrărilor vechi în proiecte mature — documentează procedura echipei. Dacă două release-uri adaugă același index, al doilea deploy eșuează — coordonarea branch-urilor și review-ul migrărilor evită conflicte costisitoare.
Migrări mici și reversibile
Preferă migrări atomice: o coloană, un index, un tabel. Metoda `down()` trebuie să anuleze `up()` când e sigur; pe tabele mari, drop column poate dura — uneori rollback e doar teoretic. Nu edita migrări deja rulate pe producție; adaugă migrări noi corrective. Tabelul `migrations` este jurnalul oficial; forțarea manuală a stării fără a înțelege ordinea poate lăsa colegii cu migrări „Pending” imposibil de reconciliat.
Coloane NOT NULL pe date existente
Adaugă coloana nullable, backfill cu job sau query, apoi migrare separată care setează NOT NULL și default. Saltul direct la NOT NULL fără default eșuează pe rânduri existente. Default-uri la nivel DB versus aplicație trebuie aliniate. Pentru coloane calculate, uneori e mai sigur un trigger sau o coloană virtuală decât backfill sincron în migrare pe milioane de rânduri.
Seeders versus migrări
Date demo stau în seeders, nu în migrări — migrările definesc structura, seeders populează medii non-producție. `db:seed --class` izolează seederele grele. Nu seed-ui date personale reale; factories generează volume pentru test. Pe producție, seederele rulează rar și doar pentru date de referință idempotente (roluri, categorii), nu pentru conținut fictiv masiv.
Deploy și lock
Rulează migrările ca pas explicit în deploy înainte de trafic pe cod nou care depinde de coloană. Migrările care blochează tabelul planifică fereastră. Comanda `schema:dump` poate reduce istoricul migrărilor vechi în proiecte mature — documentează procedura echipei. Dacă două release-uri adaugă același index, al doilea deploy eșuează — coordonarea branch-urilor și review-ul migrărilor evită conflicte costisitoare.