Ş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
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 -> valueolarak 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
nulldeğ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.
// 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
}