Lewati ke konten

Validasi Skema

Saat skema berubah antar snapshot (kolom ditambahkan, dihapus, atau diganti namanya), merql mendeteksi dan melaporkan perbedaan tersebut. Ketidakcocokan skema tidak menghalangi merge, tetapi ditampilkan agar pemanggil dapat menentukan langkah selanjutnya.

Deteksi

SchemaValidator::validate() membandingkan kumpulan kolom setiap tabel di seluruh snapshot base, sisi kita, dan sisi mereka. Laporan mencakup:

  • Kolom yang ditambahkan di sisi kita (ada di sisi kita tetapi tidak di base)
  • Kolom yang dihapus di sisi kita (ada di base tetapi tidak di sisi kita)
  • Kolom yang ditambahkan di sisi mereka
  • Kolom yang dihapus di sisi mereka
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"
    }
}

Hal yang dideteksi

Perubahan Terdeteksi Catatan
Kolom ditambahkan Ya Dilaporkan per sisi (kita/mereka)
Kolom dihapus Ya Dilaporkan per sisi
Tipe kolom berubah Tidak Tipe disimpan tetapi tidak dibandingkan
Nama kolom berubah Tidak Ditampilkan sebagai penambahan + penghapusan
Kunci utama berubah Tidak Identitas ditetapkan pada waktu snapshot

Perilaku selama merge

Jika sebuah kolom ada dalam satu snapshot tetapi tidak ada di snapshot lain, merge memperlakukan nilai kolom yang hilang sebagai null. Artinya:

  • Kolom yang ditambahkan di sisi mereka dengan nilai non-null akan muncul sebagai null -> value (diterima sebagai perubahan dari sisi mereka)
  • Kolom yang dihapus di sisi mereka dianggap memiliki null untuk semua baris di sisi mereka

Merge tetap berjalan dan menghasilkan keluaran. Ketidakcocokan skema hanya bersifat informatif. Pemanggil sebaiknya memastikan skema basis data target sesuai dengan data hasil merge sebelum menerapkannya.

Mengakses ketidakcocokan

Ketidakcocokan skema tersedia pada ThreeWayMerge (melalui schemaMismatches()) dan pada MergeResult (melalui schemaMismatches() dan hasSchemaMismatches()). Ketidakcocokan tersebut dipertahankan melalui ConflictResolver::resolve().

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
}