İçeriğe geç

Şema Doğrulaması

Şemalar anlık görüntüler arasında değiştiğinde (sütunlar eklendiğinde, kaldırıldığında veya yeniden adlandırıldığında) merql bu farklılıkları tespit eder ve bildirir. Şema uyumsuzlukları birleştirmeyi engellemez; ancak çağıranın nasıl ilerleyeceğine karar verebilmesi için görünür hale getirilir.

Tespit

SchemaValidator::validate(), her tablonun sütun kümelerini base, ours ve theirs anlık görüntülerinde karşılaştırır. Şunları bildirir:

  • ours içinde eklenen sütunlar (ours içinde bulunup base içinde bulunmayanlar)
  • ours içinde kaldırılan sütunlar (base içinde bulunup ours içinde bulunmayanlar)
  • theirs içinde eklenen sütunlar
  • theirs içinde kaldırılan sütunlar
PHP
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}

Tespit edilenler

Değişiklik Tespit edilir Notlar
Sütun eklendi Evet Her taraf için ayrı bildirilir (ours/theirs)
Sütun kaldırıldı Evet Taraf başına bildirilir
Sütun türü değişti Hayır Türler saklanır ancak karşılaştırılmaz
Sütun yeniden adlandırıldı Hayır Ekleme + kaldırma olarak görünür
Birincil anahtar değişti Hayır Kimlik, anlık görüntü sırasında sabitlenir

Birleştirme sırasındaki davranış

Bir sütun bir anlık görüntüde bulunup diğerinde bulunmadığında, birleştirme eksik sütun değerini null olarak kabul eder. Bunun anlamı:

  • theirs içinde null olmayan bir değerle eklenen sütun null -> value olarak görünür (theirs değişikliği kabul edilir)
  • theirs içinde kaldırılan sütun, theirs içindeki tüm satırlarda null değerine sahipmiş gibi görünür

Birleştirme devam eder ve bir sonuç üretir. Şema uyumsuzlukları bilgilendirme amaçlıdır. Uygulamadan önce hedef veritabanı şemasının birleştirilmiş verilerle eşleştiğini doğrulamak çağıranın sorumluluğundadır.

Uyumsuzluklara erişme

Şema uyuşmazlıkları hem ThreeWayMerge (schemaMismatches() aracılığıyla) hem de MergeResult üzerinde (schemaMismatches() ve hasSchemaMismatches() aracılığıyla) kullanılabilir. ConflictResolver::resolve() boyunca korunurlar.

PHP
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}