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
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
nulluntuk 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().
// 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
}