Przejdź do głównej zawartości

Migracje baz danych i kodu

Twoja tabela users ma 12 milionów wierszy i kolumnę o nazwie name, która musi zostać podzielona na first_name i last_name. Twój ORM ma nową wersję główną z 40 zmianami łamiącymi kompatybilność. Dostawca płatności zdeprecjonował swoje API v1 sześć miesięcy temu, a termin wygaszenia mija w przyszły piątek. Każda z tych migracji to wieloetapowy proces, w którym jeden zły ruch oznacza przestój, utratę danych lub jedno i drugie. Nie możesz sobie pozwolić na błąd i nie możesz sobie pozwolić na trzy tygodnie pracy nad tym.

  • Workflow Claude Code do planowania i generowania migracji baz danych bez przestoju, w tym wzorzec expand-contract do zmiany nazw kolumn i typów
  • Prompty do skopiowania tworzące pliki migracji, skrypty backfill danych i procedury wycofania dla Prisma, Drizzle, Knex i surowego SQL
  • Strategie aktualizacji frameworków wykorzystujące Claude Code do identyfikacji zmian łamiących kompatybilność, generowania codemodów i weryfikacji ścieżki migracji

Podstawowym wyzwaniem migracji baz danych na działającym systemie jest to, że stary i nowy kod działają jednocześnie podczas wdrażania. Twoja strategia migracji musi zapewnić, że obie wersje mogą działać poprawnie.

Claude Code generuje trzy oddzielne pliki migracji plus zmiany w kodzie aplikacji. Kluczowym elementem jest trigger bazodanowy utrzymujący obie kolumny w synchronizacji podczas okna przejściowego. Bez niego wiersze zapisane przez instancje starego kodu miałyby pusty first_name.

Po wygenerowaniu migracji, zweryfikuj ją lokalnie:

Run the Step 1 migration against our local database, then verify that: 1) the trigger correctly syncs data when I insert a row with only the old column, 2) the backfill script handles NULL values, 3) the rollback script cleanly reverses everything.

Dodanie indeksu lub zmiana typu kolumny w tabeli z wieloma milionami wierszy może zablokować tabelę na minuty. Claude Code potrafi wygenerować podejście nieblokujące.

Przetwarzanie wsadowe z przerwami jest kluczowe dla dużych tabel. Claude Code generuje skrypt śledzący postęp (ostatni przetworzony ID), dzięki czemu może wznowić pracę od miejsca przerwania zamiast zaczynać od nowa.

Aktualizacje wersji głównych są uciążliwe, ponieważ wymagają znalezienia każdego użycia zmienionego API i jego aktualizacji. Claude Code może to zrobić systematycznie.

Dla migracji ORM prompt jest podobny:

Czasami sama struktura danych musi się zmienić — przejście z płaskiej tabeli na kolumnę JSON, podział monolitycznej tabeli na znormalizowane relacje lub migracja z jednego systemu przechowywania na inny.

Claude Code generuje cały pipeline: schemat, skrypt migracji, aktualizacje ORM i weryfikację. Zapytanie weryfikujące jest często pomijane, ale niezbędne — porównuje liczbę wierszy i sumy kontrolne między starymi danymi JSON a nowymi znormalizowanymi tabelami.

Gdy zewnętrzne API deprecjonuje wersję, musisz zaktualizować każde miejsce wywołania bez psucia integracji.

Podejście z feature flag pozwala uruchamiać obie wersje API jednocześnie, kierując procent ruchu do v2 podczas monitorowania błędów, zanim zdecydujesz się na pełne przełączenie.

Każda migracja powinna mieć swój rollback. Claude Code może wygenerować oba kierunki jednocześnie.

Nigdy nie uruchamiaj migracji na produkcji po raz pierwszy. Claude Code może wygenerować test harness.

Create a migration test script that: 1) creates a fresh database from our schema, 2) seeds it with realistic test data (10,000 users, 50,000 orders), 3) runs all pending migrations, 4) runs our application test suite against the migrated database, 5) runs the rollback for each migration and verifies the schema returns to its original state, 6) measures migration execution time and reports if any step takes longer than 30 seconds.

Ten skrypt testowy staje się częścią twojego pipeline CI, wychwytując problemy z migracjami zanim trafią na staging.

Skrypt backfill zużywa całą pamięć. Wczytywanie milionów wierszy do pamięci spowoduje crash Node.js. Poproś Claude Code: “Rewrite the backfill script to use a cursor-based approach that processes 5,000 rows at a time, committing each batch separately, and logs progress every 10,000 rows.”

Trigger bazodanowy powoduje kaskadę aktualizacji. Triggery wywołujące inne triggery mogą tworzyć nieskończone pętle. Claude Code uwzględnia to używając zabezpieczeń pg_trigger_depth(), ale zweryfikuj: “Add a safety check to the sync trigger that prevents recursive execution.”

Migracja przechodzi w testach, ale nie na produkcji. Dane produkcyjne mają przypadki brzegowe, których twoje dane testowe nie mają. Najczęstsi winowajcy: wartości NULL w kolumnach, które zakładałeś, że zawsze są wypełnione, znaki unicode, ekstremalnie długie łańcuchy znaków. Poproś Claude Code: “Generate a pre-migration validation query that checks for NULL values, empty strings, and strings longer than 255 characters in the columns we are migrating.”

Aktualizacja ORM subtelnie zmienia zachowanie zapytań. Po aktualizacji Prisma lub Drizzle zapytania mogą zwracać nieco inne wyniki (inna obsługa NULL, zmienione domyślne sortowanie). Uruchom istniejący zestaw testów po aktualizacji i przekaż wszelkie błędy do Claude Code: “These 3 tests failed after the Prisma upgrade. The query results differ. Analyze why and update either the queries or the test expectations.”