Schema Migration, uygulama geliştirme sırasında veritabanı yapısındaki değişikliklerin sürüm yönetimi sürecidir. Her değişiklik, dev, staging ve production ortamlarına sırayla uygulanan bir betikle açıklanır. JetBrains (2025)'e göre, ekiplerin %78'i şema migrasyon araçlarını kullanırken, %34'ü hâlâ veritabanlarını konsol üzerinden manuel olarak düzenliyor — şema sapmasının ana kaynağı. Migrasyonları otomatikleştirmek insan hatasını ortadan kaldırır ve ortamlar arasında yapısal tutarlılığı garanti eder.
Ana noktalar
Schema Migration, farklı ortamlara sırayla uygulanan sürümlü dosyalar aracılığıyla veritabanı yapısındaki değişiklikleri yönetme uygulamasıdır. Her dosya bir dizi SQL komutu içerir: tablo oluşturma, sütun ekleme, dizin değiştirme veya kısıtlamaları güncelleme. Migrasyon aracı, uygulanan sürümleri izler ve her değişikliğin tam olarak bir kez yürütülmesini sağlar.
Tablo içeriklerini aktaran Data Migration'ın aksine, Schema Migration yalnızca yapıyı — DDL işlemlerini — yönetir. Bu temel bir farktır: Schema Migration, Data Migration'dan önce çalışır, hedef şemayı oluşturur ve ardından veriler yüklenir. Redgate (2024)'e göre, üretim veritabanlarındaki olayların %62'si, migrasyon betikleri olmadan yapılan manuel şema değişiklikleriyle ilgilidir.
Her Schema Migration benzersiz bir tanımlayıcı alır — genellikle bir sürüm (V1, V2) veya zaman damgası. Araç, özel bir tabloda (flyway_schema_history, alembic_version) uygulanan migrasyonların bir listesini saklar. Başlangıçta, listeyi classpath'teki dosyalarla karşılaştırır ve yalnızca yenilerini uygular. Idempotence önemli bir özelliktir: yeniden çalıştırmanın yan etkisi yoktur.
Tipik Schema Migration işlemleri: tablo oluşturma (CREATE TABLE), sütun ekleme (ALTER TABLE ADD COLUMN), tür değiştirme, dizin oluşturma, yabancı anahtar ekleme ve dizileri güncelleme. Daha karmaşık migrasyonlar, verileri koruyarak sütunları yeniden adlandırmayı, bir tabloyu birden çok parçaya bölmeyi ve bir şemayı parçalar arasında çoğaltmayı içerir.
Schema Migration olmadan, geliştiriciler veritabanını manuel olarak değiştirir — konsolda DDL düzenler, dev ortamında sütunlar ekler ve bunları bellekten staging'e kopyalar. Sonuç: ortamlar arasında şema sapması, dağıtım sırasında değişiklik kaybı ve üretimde bozuk migrasyonlar. Schema Migration üç temel sorunu çözer: tutarlılık, tekrarlanabilirlik ve denetim.
Veritabanı yapısı kodda açıklandığında, dev, staging ve üretimde aynıdır. Bir geliştirici değişiklik uygulamayı unutamaz — araç, kaçırılan tüm migrasyonları sırayla yürütür. Üretimde bir sütun eksikse ancak kod bunu gerektiriyorsa, uygulama bir hatayla başarısız olur. Otomatik doğrulama bu senaryoyu ortadan kaldırır.
Yeni bir ekip üyesi flyway migrate komutunu çalıştırır ve saniyeler içinde geçerli şemayı alır — üretim dökümü veya manuel DDL sorguları olmadan. Bu, özellikle her hizmetin kendi veritabanına sahip olduğu ve şemanın düzinelerce migrasyondan oluşturulduğu mikro hizmet mimarisinde önemlidir. Tam tekrarlanabilirlik, işe alım süresini günlerden dakikalara indirir.
Her Schema Migration, uygulama koduyla birlikte sürüm kontrol sisteminde saklanır. Bir Pull Request açabilir, şema değişikliğinin tam SQL komutlarını görebilir ve kod incelemesi yapabilirsiniz. Bir olay durumunda, en son hangi migrasyonun uygulandığını ve kimin yazdığını belirlemek kolaydır. Git geçmişi, proje boyunca veritabanı değişikliklerinin tam izini sağlar.
Farklı diller ve platformlar için düzinelerce Schema Migration aracı mevcuttur. Seçim, teknoloji yığınına, migrasyon tanımlama formatına ve rollback gereksinimlerine bağlıdır. Ana kategorilere ve popüler araçlara göz atalım.
| Araç | Dil | Format | Rollback |
|---|---|---|---|
| Flyway | Java, Kotlin, Scala | SQL, Java | Ayrı betiklerle |
| Liquibase | Java, Groovy, Kotlin | XML, YAML, JSON, SQL | Yerleşik rollback |
| Alembic | Python | Python, SQL | Otomatik oluşturulan downgrade |
| Active Record | Ruby | Ruby DSL | Revert ile |
| Entity Framework | C# | C# Fluent API | Otomatik oluşturma |
Java/Kotlin yığınları için — Flyway en hafif ve öngörülebilir olanıdır. Sık rollback gerektiren projeler için — Liquibase, mimarisinde yerleşik rollback'e sahiptir. Python/Django için — Alembic standart SQLAlchemy aracıdır. DevOps mühendisi olmayan startuplar için — en az yapılandırmaya sahip aracı seçin: Flyway yalnızca bir betik dosyası ve migrate komutu gerektirir.
Açık kaynak araçların yanı sıra ticari çözümler de vardır: Redgate SQL Change Automation, Datical DB ve DBmaestro. Bunlar görsel şema karşılaştırması, otomatik çakışma çözümü ve CI/CD ardışık yapı entegrasyonu sağlar. Ancak, çoğu proje için Flyway veya Alembic, ek lisans olmadan ihtiyaçların %100'ünü karşılar.
Flyway ile Kotlin'de pratik bir Schema Migration örneğine bakalım. PostgreSQL veritabanına orders tablosu ekleyen bir migrasyon oluşturacağız. Flyway otomatik olarak flyway_schema_history tablosunu oluşturur ve uygulanan sürümleri izler.
-- 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)
);
dataSource yapılandırması aracılığıyla bir Kotlin projesinde Flyway bağlantısı. Kurulumdan sonra flyway:migrate komutu, classpath'teki tüm yeni migrasyonları uygulayacaktır.
// FlywayConfig.kt — Spring Boot'ta Flyway yapılandırması
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, SQLAlchemy üzerine inşa edilmiş Python için bir Schema Migration aracıdır. Temel özelliği, SQLAlchemy modelini mevcut veritabanı şemasıyla karşılaştırarak betikleri otomatik olarak oluşturmaktır. Alembic, Django, FastAPI ve Flask projeleri için uygundur.
Başlatma (alembic init alembic) ve bağlantı dizesini yapılandırdıktan sonra, alembic revision --autogenerate komutu SQLAlchemy modellerini tarar ve bir migrasyon betiği oluşturur. Geliştiricinin yalnızca oluşturulan kodu incelemesi ve alembic upgrade head ile uygulaması gerekir. Autogenerate, manuel DDL yazma saatlerinden tasarruf sağlar.
# models.py — otomatik oluşturma için SQLAlchemy modeli
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)
Deneyimli ekipler, başarısızlık riskini azaltan ve hata ayıklamayı basitleştiren bir dizi Schema Migration kuralı geliştirmiştir. Bu uygulamaları takip etmek, olgun bir mühendislik kültürünün işaretidir. Beş temel kural, migrasyonların tasarımını, testini ve dağıtımını kapsar.
Her Schema Migration tam olarak bir mantıksal değişiklik yapmalıdır: tablo oluşturma, sütun ekleme veya dizin değiştirme. Birden çok işlemi tek bir migrasyonda karıştırmak rollback'i karmaşık hale getirir — ikinci işlem başarısız olursa, birincisi zaten uygulanmıştır ve ayrı olarak geri alınması gerekir. Küçük adımlar güvenilir migrasyonların temelidir.
Bir migrasyon üretime uygulandıktan sonra değiştirilemez — yalnızca sorunu çözen yeni bir migrasyon oluşturulabilir. Yayınlanan bir migrasyonu düzenlemek izleyiciyi bozar: farklı bir veritabanına sahip geliştiriciler bir hash uyuşmazlığı görecektir. Değiştirilemez migrasyonlar, tüm ortamlarda öngörülebilir davranışı garanti eder.
Bir Schema Migration'ı üretime uygulamadan önce, üretim verilerinin bir kopyasında çalıştırın. Amaç, yürütme hızını, tablo kilitlerinin varlığını ve değişikliklerin doğruluğunu kontrol etmektir. Büyük tablolar için ALTER TABLE saatlerce yazmayı engelleyebilir — testler bunu önceden belirleyecektir. Üretim dökümüyle Staging zorunlu bir adımdır.
NOT NULL ile varsayılan değeri olmayan yeni bir sütun, migrasyon başarısızlığının yaygın bir nedenidir. Mevcut kayıtlarda değer NULL olacak ve NOT NULL bir hataya neden olacaktır. En iyi uygulama: sütunu varsayılan değer ve nullable ile oluşturun, ardından verileri doldurduktan sonra ayrı bir migrasyonda NOT NULL ekleyin.
Sıkça sorulan sorular
Schema Migration veritabanı yapısını (tablolar, sütunlar, dizinler) yönetirken, Data Migration içeriği (satırlar, belgeler) yönetir. Schema Migration her zaman önce çalışır, hedef şemayı oluşturur, ardından Data Migration onu verilerle doldurur. Farklı araçlar: şemalar için Flyway, veriler için ETL.
Java/Kotlin için — Flyway en basit ve en hızlısı. Python için — Alembic, SQLAlchemy ile entegre. .NET için — Entity Framework Migrations. Çok dilli projeler için — Liquibase bağımsız tanımlama formatıyla.
Flyway otomatik rollback'i desteklemez — ayrı bir geri alma betiği yazmanız gerekir. Liquibase, XML/YAML formatı için otomatik olarak rollback oluşturur. Alembic, her migrasyon için bir downgrade işlevi oluşturur. Rollback yerine yeni bir migrasyonla değiştirilemez yaklaşım modern uygulamadır.
Araç, migrasyonu başarısız olarak işaretler. Veritabanı, uygulamadan önceki durumunda kalır (otomatik commit yoksa). Hatayı yeni bir migrasyonda düzeltmeniz ve tekrar çalıştırmanız gerekir. Asla başarısız bir migrasyonu düzenlemeyin — yenisini oluşturun.
Üretim projesi için — evet. Git dışında manuel DDL değişiklikleri şema sapmasına, bozuk dağıtımlara ve veri kaybına yol açar. Bir MVP için bile minimum bir araç kullanın — örneğin, birkaç SQL betiğiyle Flyway. Bu, staging'e ilk dağıtımda kendini amorti edecektir.
Özet
NOT NULL ekleyin.Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun