Schema Migration — podstata, typy a nástroje migrace schémat databází

Autor: IT Sectr Publikováno: 2026-06-15 Doba čtení: 10 min

Schema Migration je proces verzovaného řízení změn struktury databáze během vývoje aplikací. Každá změna je popsána skriptem, který je postupně aplikován v prostředích dev, staging a production. Podle JetBrains (2025) používá 78 % týmů nástroje pro migraci schémat a 34 % stále ručně upravuje databázi přes konzoli — hlavní zdroj odchylek schémat. Automatizace migrací eliminuje lidský faktor a zaručuje konzistenci struktury mezi prostředími.

Hlavní body

  • Schema Migration — verzovaná změna struktury databáze pomocí skriptů.
  • Flyway — nástroj pro Java/Kotlin s jednoduchými SQL migračními skripty.
  • Liquibase — formát XML/YAML/JSON s podporou rollbacku.
  • Alembic — Python nástroj pro SQLAlchemy s auto-generací.
  • Konflikty schémat — hlavní problém při práci více vývojářů bez migrací.

Co je Schema Migration

Schema Migration je praxe řízení změn struktury databáze prostřednictvím verzovaných souborů, které jsou postupně aplikovány v různých prostředích. Každý soubor obsahuje sadu SQL příkazů: vytvoření tabulky, přidání sloupce, změna indexu nebo aktualizace omezení. Migrační nástroj sleduje aplikované verze a zaručuje, že každá změna je provedena přesně jednou.

Na rozdíl od Data Migration, která přenáší obsah tabulek, Schema Migration spravuje pouze strukturu — operace DDL. To je zásadní rozdíl: Schema Migration pracuje před Data Migration, vytváří cílové schéma, které pak Data Migration naplní daty. Podle Redgate (2024) souvisí 62 % incidentů v produkčních databázích s ručními změnami schématu bez migračních skriptů.

Verzování migrací

Každá Schema Migration získá jedinečný identifikátor — obvykle verzi (V1, V2) nebo časové razítko. Nástroj ukládá do speciální tabulky (flyway_schema_history, alembic_version) seznam aplikovaných migrací. Při spuštění porovná seznam se soubory v classpath a aplikuje pouze nové. Idempotence je klíčová vlastnost: opakované spuštění nezpůsobuje vedlejší účinky.

Typy změn schématu

Typické operace Schema Migration: vytváření tabulek (CREATE TABLE), přidávání sloupců (ALTER TABLE ADD COLUMN), změna typů, vytváření indexů, přidávání cizích klíčů a aktualizace sekvencí. Složitější migrace zahrnují přejmenování sloupců s zachováním dat, rozdělení tabulky na několik částí a replikaci schématu na shardy.

Proč je potřeba migrace schématu databáze

Bez Schema Migration vývojáři ručně mění databázi — píší DDL v konzoli, přidávají sloupce v dev prostředí a kopírují je do stagingu z paměti. Výsledek: odchylka schémat mezi prostředími, ztráta změn při nasazení a poškozené migrace na produkci. Schema Migration řeší tři klíčové problémy: konzistenci, reprodukovatelnost a audit.

Konzistence mezi prostředími

Když je struktura databáze popsána v kódu, je identická v dev, staging a production. Vývojář nemůže zapomenout aplikovat změnu — nástroj provede všechny zmeškané migrace postupně. Pokud na produkci chybí sloupec, ale kód ho vyžaduje — aplikace spadne s chybou. Automatická kontrola tento scénář eliminuje.

Reprodukovatelnost pro nové vývojáře

Nový člen týmu spustí flyway migrate a během několika sekund získá aktuální schéma — bez dumpu z produkce a ručních DDL dotazů. To je obzvláště důležité v mikroslužbové architektuře, kde každá služba má vlastní databázi a schéma se skládá z desítek migrací. Plná reprodukovatelnost zkracuje dobu zapracování z dnů na minuty.

Audit změn

Každá Schema Migration je uložena v systému správy verzí spolu s kódem aplikace. Lze otevřít Pull Request, vidět přesné SQL příkazy změny schématu a provést code review. Při incidentu lze snadno určit, která migrace byla aplikována jako poslední a kdo je jejím autorem. Historie Git poskytuje úplnou stopu změn databáze po celou dobu trvání projektu.

Nástroje pro migraci schémat

Na trhu existují desítky nástrojů Schema Migration pro různé jazyky a platformy. Výběr závisí na technologickém stacku, formátu popisu migrací a požadavcích na rollback. Podívejme se na hlavní kategorie a populární nástroje.

NástrojJazykFormátRollback
FlywayJava, Kotlin, ScalaSQL, JavaPřes samostatné skripty
LiquibaseJava, Groovy, KotlinXML, YAML, JSON, SQLVestavěný rollback
AlembicPythonPython, SQLAuto-generace downgrade
Active RecordRubyRuby DSLPřes revert
Entity FrameworkC#C# Fluent APIAuto-generace

Jak vybrat nástroj

Pro Java/Kotlin stacky — Flyway jako nejlehčí a nejpředvídatelnější. Pro projekty s častým rollbackem — Liquibase, který má rollback architektonicky vestavěný. Pro Python/Django — Alembic jako standardní nástroj SQLAlchemy. Pro startupy bez DevOps inženýra — vyberte nástroj s nejmenší konfigurací: Flyway vyžaduje pouze soubor se skriptem a příkaz migrate.

Komerční řešení

Kromě open-source nástrojů existují komerční řešení: Redgate SQL Change Automation, Datical DB a DBmaestro. Poskytují vizuální porovnání schémat, automatické řešení konfliktů a integraci s CI/CD pipeline. Pro většinu projektů však Flyway nebo Alembic pokrývají 100 % potřeb bez dalších licencí.

Migrace s Flyway

Podívejme se na praktický příklad Schema Migration v Kotlin s Flyway. Vytvoříme migraci, která přidá tabulku orders do databáze PostgreSQL. Flyway automaticky vytvoří tabulku flyway_schema_history a sleduje aplikované verze.

sql
-- V1__Create_Orders_Table.sql
CREATE TABLE orders (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id         UUID NOT NULL,
    total_amount    DECIMAL(10,2) NOT NULL,
    currency        VARCHAR(3) NOT NULL DEFAULT 'USD',
    status          VARCHAR(20) NOT NULL DEFAULT 'pending',
    created_at     TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id)
);

Připojení Flyway v Kotlin projektu přes konfiguraci dataSource. Po konfiguraci příkaz flyway:migrate aplikuje všechny nové migrace z classpath.

kotlin
// FlywayConfig.kt — Konfigurace Flyway v Spring Boot
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.flywaydb.core.Flyway

@Configuration
class FlywayConfig {
    @Bean
    fun flyway(dataSource: DataSource): Flyway {
        return Flyway.configure()
            .dataSource(dataSource)
            .locations("classpath:db/migration")
            .baselineOnMigrate(true)
            .load()
    }
}

Alembic pro Python projekty

Alembic je nástroj Schema Migration pro Python, postavený na SQLAlchemy. Jeho klíčovou vlastností je auto-generace skriptů na základě porovnání modelu SQLAlchemy s aktuálním schématem databáze. Alembic je vhodný pro projekty v Django, FastAPI a Flask.

Inicializace a vytvoření migrace

Po inicializaci (alembic init alembic) a konfiguraci connection stringu příkaz alembic revision --autogenerate naskenuje modely SQLAlchemy a vygeneruje migrační skript. Vývojáři zbývá zkontrolovat vygenerovaný kód a aplikovat ho přes alembic upgrade head. Autogenerate šetří hodiny ručního psaní DDL.

python
# models.py — Model SQLAlchemy pro auto-generaci
from sqlalchemy import Column, Integer, String, DateTime, Enum
from sqlalchemy.orm import DeclarativeBase
import enum

class OrderStatus(enum.Enum):
    pending = "pending"
    paid = "paid"
    shipped = "shipped"

class Base(DeclarativeBase):
    pass

class Order(Base):
    __tablename__ = "orders"
    id = Column(Integer, primary_key=True)
    status = Column(Enum(OrderStatus), nullable=False)
    created_at = Column(DateTime, nullable=False)

Nejlepší postupy migrace schémat

Zkušené týmy vyvinuly sadu pravidel Schema Migration, která snižují riziko selhání a zjednodušují ladění. Dodržování těchto postupů je znakem zralé inženýrské kultury. Pět klíčových pravidel pokrývá navrhování, testování a nasazování migrací.

Jedna migrace — jedna změna

Každá Schema Migration by měla provést přesně jednu logickou změnu: vytvořit tabulku, přidat sloupec nebo změnit index. Míchání více operací v jedné migraci komplikuje rollback — pokud druhá operace selže, první už byla aplikována a musí se vracet samostatně. Malé kroky jsou základem spolehlivých migrací.

Nikdy neupravovat publikované migrace

Poté, co byla migrace aplikována na produkci, nelze ji měnit — pouze vytvořit novou, která problém opravuje. Úprava publikované migrace rozbíjí tracker: vývojáři s jinou databází uvidí neshodu hashů. Neměnitelné migrace zaručují předvídatelné chování ve všech prostředích.

Testování na kopii produkce

Před aplikací Schema Migration na produkci ji spusťte na kopii produkčních dat. Cílem je zkontrolovat rychlost provedení, existenci zámků tabulek a správnost změn. U velkých tabulek může ALTER TABLE blokovat zápis na hodiny — test to odhalí včas. Staging s produkčním dumpem je povinný krok.

Vyhnout se NOT NULL u nových sloupců

Nový sloupec bez výchozí hodnoty s NOT NULL — častá příčina selhání migrace. V existujících záznamech bude hodnota NULL a NOT NULL způsobí chybu. Nejlepší postup: vytvořte sloupec s výchozí hodnotou a nullable, pak samostatnou migrací přidejte NOT NULL po naplnění dat.

Často kladené otázky

Jaký je rozdíl mezi Schema Migration a Data Migration?

Schema Migration spravuje strukturu databáze (tabulky, sloupce, indexy), Data Migration spravuje obsah (řádky, dokumenty). Schema Migration se vždy provádí první, vytváří cílové schéma, které pak Data Migration naplní daty. Nástroje jsou různé: Flyway pro schémata, ETL pro data.

Který nástroj pro migraci schémat vybrat pro nový projekt?

Pro Java/Kotlin — Flyway jako nejjednodušší a nejrychlejší. Pro Python — Alembic, integrovaný s SQLAlchemy. Pro .NET — Entity Framework Migrations. Pro vícejazyčné projekty — Liquibase s nezávislým formátem popisu.

Jak vrátit Schema Migration?

Flyway nepodporuje automatický rollback — je třeba napsat samostatný skript pro zrušení. Liquibase generuje rollback automaticky pro formát XML/YAML. Alembic vytváří downgrade funkci pro každou migraci. Neměnitelný přístup s novou migrací místo rollbacku je moderní praxe.

Co se stane, když migrace na produkci selže?

Nástroj označí migraci jako neúspěšnou. Databáze zůstává ve stavu před jejím použitím (pokud nedošlo k auto-commitu). Je třeba opravit chybu v nové migraci a spustit znovu. Nikdy neupravujte neúspěšnou migraci — vytvořte novou.

Je povinné používat nástroj pro migraci schémat?

Pro produkční projekt — ano. Ruční změny DDL mimo Git vedou k odchylkám schémat, poškozeným nasazením a ztrátě dat. Dokonce i pro MVP používejte minimální nástroj — například Flyway s několika SQL skripty. To se vyplatí při prvním nasazení na staging.

Shrnutí

  • Schema Migration — verzovaná změna struktury databáze pomocí skriptů v Git.
  • Řeší problémy konzistence schémat mezi dev, staging a production prostředími.
  • Flyway — standard pro Java/Kotlin, Alembic — pro Python, Liquibase — pro vícejazyčné projekty.
  • Jedna migrace = jedna změna. Neupravovat publikované migrace.
  • Testovat migrace na kopii produkčních dat před použitím.
  • Nové sloupce vytvářet nullable s výchozí hodnotou, NOT NULL přidávat samostatnou migrací.
  • Neměnitelný přístup s novou migrací je spolehlivější než automatický rollback starých.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také