Migracje schematów baz danych
Struktura tabeli zmienia się razem z aplikacją — migracja zapisuje tę zmianę przewidywalnie.
Słowo „migracja” migracja schematu - Zmiana struktury bazy danych z czasem. Drugi, czyli przenoszenie danych między bazami danych, jest omówiony w 22.28.
Aplikacja rośnie, a struktura tabeli zaprojektowana na początku przestaje wystarczać. Na przykład zadanie otrzymuje oznaczenie „wykonano”:
| Wersja 1 | Wersja 2 |
|---|---|
| tasks(id, title) | tasks(id, title, done) |
Migracja schematu — to zapisane zmiany w strukturze, które można
zastosować do bazy danych tak samo przewidywalnie na każdym komputerze: u dewelopera lokalnie,
u kolegi, na serwerze. W SQL do tego jest komenda ALTER TABLE:
ALTER TABLE tasks ADD COLUMN done INTEGER NOT NULL DEFAULT 0;
Stare wiersze nie znikają — każdy wiersz ma nową kolumnę done
otrzymuje wartość domyślną, 0.
import sqlite3
baza = sqlite3.connect("zadachi.db")
baza.execute("ALTER TABLE tasks ADD COLUMN done INTEGER NOT NULL DEFAULT 0")
baza.commit()
Narzędzia, które zapisują migracje za Ciebie
W małym projekcie wystarczy wykonać ALTER TABLE
ręcznie raz. W większym projekcie z wieloma programistami i wieloma
środowiska migracji są zazwyczaj formatowane z osobnymi plikami z numerami i kolejnością ich użycia
– tak aby każda zmiana w strukturze mogła być zastosowana, śledzona i, jeśli zajdzie taka potrzeba,
cofnij się. W ekosystemie SQLAlchemy w tym celu, Alembic — osobne narzędzie do migracji schematu, które potrafi porównać aktualną strukturę bazy z opisem w kodzie i wygenerować szkic migracji; taki automatycznie wygenerowany plik — to nie gotowe rozwiązanie, a „szkic migracji” (candidate migration)), który trzeba sprawdzić i w razie potrzeby ręcznie poprawić przed zastosowaniem. W Django migracje są wbudowane w sam framework: polecenie makemigrations tworzy pliki migracji dla
wykryte zmiany modelu, oraz migrate stosuje je do
baza danych.