Cum să gestionezi migrări ale schemei bazei de date
In this tutorial, you'll learn about Cum să gestionezi migrări ale schemei bazei de date. We cover key concepts, practical examples, and best practices.
Cum să gestionezi migrări ale schemei bazei de date — modificări structurale sigure și versionate care se aplică progresiv fără a pierde date și cu posibilitate de rollback.
Problema
Pe măsură ce o aplicație evoluează, și structura bazei de date trebuie să se schimbe: tabele noi, coloane adăugate, constrângeri modificate. Fără un sistem de migrare, modificările se aplică manual, se pierd în istoric și nu pot fi reproduse pe alte medii.
The Wrong Way
Modificarea schemei direct pe baza de date de producție, fără versionare:
-- Direct pe producție:
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- Peste o lună, nimeni nu știe cine a făcut această modificare
-- Când configurezi o nouă instanță, trebuie să aplici toate modificările manual
Problema: Fără versionare, este imposibil de reprodus aceeași structură pe un mediu nou. Fără rollback, o modificare greșită poate bloca producția ore întregi.
The Right Way
Folosește un tool de migrare (Flyway, Liquibase, Alembic) sau un sistem propriu de fișiere versionate.
Migrare cu fișiere SQL versionate
Creează un director migrations/ cu fișiere numerotate:
-- V1__create_users.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- V2__add_phone_to_users.sql
ALTER TABLE users
ADD COLUMN phone VARCHAR(20);
-- V2__add_phone_to_users__rollback.sql
ALTER TABLE users
DROP COLUMN phone;
Script de migrare automat
#!/bin/bash
# migrate.sh
DB_URL="postgresql://user:pass@localhost/my_database"
MIGRATIONS_DIR="./migrations"
for file in $(ls ${MIGRATIONS_DIR}/V*__*.sql | sort); do
echo "Applying: $file"
psql ${DB_URL} -f "$file"
if [ $? -ne 0 ]; then
echo "Migration failed: $file"
exit 1
fi
done
echo "All migrations applied successfully."
Step-by-Step Fix
1. Planifică migrarea
Înainte de a scrie SQL, răspunde la:
- Ce se întâmplă cu datele existente? (valori default, NULL permis)
- Este nevoie de downtime?
- Cum faci rollback?
2. Scrie migrarea
Adaugă o coloană cu valoare default:
ALTER TABLE orders
ADD COLUMN discount DECIMAL(5,2) NOT NULL DEFAULT 0.00;
-- Actualizează date existente (dacă e necesar)
UPDATE orders SET discount = 0.10
WHERE total > 1000;
3. Scrie rollbackul
ALTER TABLE orders
DROP COLUMN discount;
4. Aplică migrarea
psql -U postgres -d my_database -f migrations/V3__add_discount.sql
5. Verifică rezultatul
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'orders';
Prevention Tips
- Toate migrările trebuie versionate și stocate în Git
- Fiecare migrare trebuie să aibă un rollback corespunzător
- Testează migrările pe o copie a bazei de producție înainte de aplicare
- Rulează migrările în tranzacții explicite (BEGIN/COMMIT) când este posibil
- Nu modifica migrările deja aplicate — creează una nouă
Greșeli comune cu migrări
- Fără rollback — nu poți reveni la starea anterioară
- Migrări modificate după aplicare — inconsistență între medii
- Adăugarea unei coloane NOT NULL fără DEFAULT — eșuează pe tabele cu date existente
- Migrări prea mari — o singură migrare care face 20 de modificări e greu de revizuit
- Applicarea direct pe producție fără testare — eroarea blochează întreaga aplicație
Exercițiu practic
Creează un director de migrări cu 3 fișiere: V1 care creează tabela products, V2 care adaugă coloana stock INT NOT NULL DEFAULT 0, V3 care adaugă un index pe category_id. Scrie și rollbackurile corespunzătoare.
Soluție:
-- V1__create_products.sql
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
price DECIMAL(10,2) NOT NULL,
category_id INT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- V2__add_stock.sql
ALTER TABLE products ADD COLUMN stock INT NOT NULL DEFAULT 0;
-- V3__add_category_index.sql
CREATE INDEX idx_products_category ON products(category_id);
FAQ
Construit de dezvoltătorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech se integrează nativ cu bazele de date pentru productivitate și securitate sporite.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro