İçeriğe geç

Environment Diff

Environment Diff özelliği, iki ortamın veritabanı şemalarını yan yana karşılaştırmanızı sağlar. Bir dalı ebeveynine merge etmeden önce hangi şema değişikliklerinin yapıldığını anlamak veya herhangi iki ortam arasındaki yapısal farkları denetlemek için kullanışlıdır.

Ortam şema diff karşılaştırması


Karşılaştırma motoru, ortamlar arasındaki yapısal farkları üç aşamada tanımlar:

  1. Şema Analizi: Sistem hem kaynak hem hedef ortamları, tablolar, sütunlar, indeksler, kısıtlamalar ve ilişkiler dahil tam yapılarını anlamak için inceler.
  2. Karşılaştırma: İki yapı aşağıda açıklanan yalnızca ileri semantiğine göre karşılaştırılır. Motor, kaynak ortamdan hedefte eksik olan değişiklikleri tam olarak tanımlar.
  3. Migrasyon Üretimi: Her tespit edilen değişiklik için sistem, o değişikliği hedef ortama güvenle uygulamak için gereken karşılık gelen SQL komutlarını otomatik olarak üretir.

Diff motoru yalnızca ileri semantiği kullanır. Bu şu anlama gelir:

  • Kaynakta var ama HEDEFTE OLMAYAN nesnelerCREATED olarak gösterilir (hedefte oluşturulmaları gerekir)
  • HER İKİSİNDE de var olan nesneler → alan alan karşılaştırılır, farklar değişiklik olarak gösterilir
  • Yalnızca HEDEFTE var olan nesnelerDROPPED olarak gösterilmez

Bu önemli bir tasarım kararıdır. Bir tablo yalnızca hedef ortamda varsa, kaynakta hiç bulunmamıştır. TABLE_DROPPED olarak göstermek yanıltıcı olurdu çünkü kaynakta hiçbir drop işlemi gerçekleştirilmemiştir. Diff yalnızca kaynakta köken alan ve hedefe yayılması gereken değişikliklere odaklanır.

İstisna: Her iki ortamda da var olan tablolar içindeki sütun düzeyi değişiklikler için COLUMN_DROPPED tespit edilir çünkü kaynakta gerçekleştirilen gerçek bir sütun kaldırma işlemini temsil eder.


Diff motoru aşağıdaki şema değişikliği kategorilerini tespit eder:

Değişiklik TürüAçıklamaBreaking
TABLE_CREATEDTablo kaynakta var ama hedefte yokHayır
COLUMN_ADDEDKaynakta bir tabloya yeni sütun eklendiHayır
COLUMN_DROPPEDSütun hedefte var ama kaynakta kaldırıldıEvet
COLUMN_TYPE_CHANGEDSütunun veri tipi değiştirildiDuruma bağlı*
COLUMN_NULLABLE_CHANGEDSütunun nullable kısıtlaması değiştirildiDuruma bağlı
COLUMN_DEFAULT_CHANGEDSütunun varsayılan değeri değiştirildiHayır
INDEX_CREATEDYeni indeks eklendiHayır
INDEX_DROPPEDİndeks kaldırıldıHayır
ENUM_CREATEDYeni enum tipi kaynakta var ama hedefte yokHayır
ENUM_VALUE_ADDEDEnum’a yeni değer eklendiHayır
ENUM_VALUE_REMOVEDEnum’dan değer kaldırıldıEvet
VIEW_CREATEDGörünüm kaynakta var ama hedefte yokHayır
VIEW_MODIFIEDGörünümün SQL tanımı değiştirildiHayır
RELATIONSHIP_ADDEDYeni foreign key ilişkisi eklendiHayır
RELATIONSHIP_DROPPEDForeign key ilişkisi kaldırıldıEvet

* Tip daraltma (örn. textvarchar(50) veya int8int4) veri kaybına neden olabileceği için breaking olarak sınıflandırılır. Tip genişletme (örn. varchartext) güvenli olarak sınıflandırılır.

Not: Üst düzey TABLE_DROPPED, ENUM_DROPPED ve VIEW_DROPPED yalnızca ileri diff tarafından üretilmez. Yalnızca hedefte var olan nesneler kaynak perspektifinden “kaldırılmış” olarak kabul edilmez.


Diff görünümü seçici değişiklik uygulamasını destekler. Kullanıcılar:

  • Onay kutuları kullanarak tek tek değişiklikleri seçebilir veya seçimini kaldırabilir
  • Grup onay kutusu kullanarak bir gruptaki tüm değişiklikleri (örn. belirli bir tablo için) seçebilir veya seçimini kaldırabilir
  • Breaking (yıkıcı) değişiklikler varsayılan olarak önceden seçili değildir — kullanıcı açıkça onaylamalıdır

Yalnızca seçilen değişiklikler merge uygulanırken dahil edilir.


query EnvironmentDiff($input: EnvironmentDiffInput!) {
environmentDiff(input: $input) {
success
message
changes {
changeType
objectType
objectName
fieldName
oldValue
newValue
isBreaking
sql
}
summary {
totalChanges
breakingChanges
addedTables
droppedTables
modifiedTables
}
}
}

Variables:

{
"input": {
"projectId": "f7e4a264-d659-4719-91e8-c2d74654e529",
"sourceEnvironment": "master",
"targetEnvironment": "staging"
}
}

changes dizisindeki her giriş, aşağıdaki alanlarla tek bir şema değişikliğini temsil eder:

  • changeType: Yukarıda listelenen değişiklik türü tanımlayıcılarından biri.
  • objectType: Etkilenen veritabanı nesnesinin türü (table, column, index, enum, view, relationship).
  • objectName: Etkilenen nesnenin adı (örn. tablo adı).
  • fieldName: Sütun düzeyi değişiklikler için spesifik sütunun adı.
  • oldValue / newValue: Değişiklikler için önceki ve sonraki değerler (örn. "varchar(255)""text").
  • isBreaking: Bu değişikliğin veri kaybına veya API kırılmasına neden olup olamayacağını gösteren boolean.
  • sql: Bu değişikliği uygulamak için üretilen DDL ifadesi.