Merql
Merge database tiga arah murni dalam PHP dengan penyelesaian konflik tingkat kolom. Semantik merge bergaya Git untuk tabel MySQL dan SQLite.
composer require merql/merqlRilis terbaru v0.4.1 MIT PHP 8.2+
use Merql\Merql;
Merql::init($connection);
// Snapshot all tables.
$snapshot = Merql::snapshot('baseline');
// Snapshot specific tables.
$snapshot = Merql::snapshot('baseline', ['posts', 'comments', 'users']);Dalam praktik
Merge membaca tiga snapshot tersimpan dan mengembalikan operasi yang perlu ditulis serta konflik yang perlu diselesaikan.
Gabungkan tiga snapshot
Ambil snapshot base sebelum kedua salinan berbeda, lalu ambil snapshot setiap sisi, misalnya database aktif dan salinan sandbox. ThreeWayMerge membandingkan kedua sisi dengan base dan menggabungkan kedua changeset.
Di tab hasil, ours mengedit content dan theirs mengedit title serta status pada baris yang sama, sehingga merge mempertahankan ketiga perubahan tanpa konflik.
use Merql\Merge\ThreeWayMerge;
$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);
echo $result->operationCount(); // resolved operations
echo $result->conflictCount(); // unresolved conflictsBase: { title: "Hello", content: "Body", status: "draft" }
Ours: { title: "Hello", content: "Body v2", status: "draft" }
Theirs: { title: "New Title", content: "Body", status: "publish" }
Result: { title: "New Title", content: "Body v2", status: "publish" }Merge Tiga Arah
Basis, milik kita, milik mereka. Penggabungan tiga arah bergaya git pada baris dan kolom berkunci, bukan baris teks. Mendeteksi penyisipan, pembaruan, dan penghapusan di dua cabang.
Penyelesaian Tingkat Kolom
Saat kedua sisi mengubah baris yang sama, merql membandingkan kolom demi kolom. Konflik hanya terjadi jika kolom yang sama diubah ke nilai berbeda.
Penggabungan Sel Opsional
Berikan CellMergeConfig ke ThreeWayMerge agar kolom TEXT digabungkan baris demi baris dengan diff Myers, dan kolom JSON berdasarkan kunci. Facade Merql dan CLI tidak mengaktifkannya.
Multi-Database
Adaptor koneksi dan driver dialek yang dapat dipasang, dengan MySQL dan SQLite sudah tersedia.
Deteksi Konflik
Pembaruan vs pembaruan, pembaruan vs penghapusan, penghapusan vs pembaruan, dan penyisipan vs penyisipan, masing-masing dilaporkan beserta tabel dan barisnya. Konflik pembaruan vs pembaruan juga menyebutkan kolomnya.
SQL Generation
Pernyataan INSERT, UPDATE, DELETE berparameter dengan pengurutan yang memperhatikan FK. Pratinjau uji coba atau terapkan dalam transaksi.
CLI
Ambil snapshot, buat diff, dan lakukan merge dari baris perintah. Mendukung MySQL dan SQLite melalui variabel lingkungan.
Teruji
32 skenario regresi dengan ekspektasi yang ditulis tangan (composer test:oracle). CI menjalankan pengujian unit dan integrasi 231 serta level 10 PHPStan.
Mengapa Merql
Snapshot berupa berkas
Setiap snapshot adalah satu berkas JSON yang dapat Anda salin antar mesin atau commit ke kontrol versi. Diff dan merge membaca berkas tersebut, sehingga dapat berjalan tanpa koneksi database.
Tinjau sebelum menulis
Rencana merge memberi setiap operasi dan grup perubahan ID stabil serta menyimpan baris base, ours, theirs, dan hasil. Pilih grup yang Anda inginkan lalu terapkan hanya grup tersebut.
Rencana usang dihentikan
Penerapan terjaga hanya menulis ke baris yang masih cocok dengan snapshot yang Anda tinjau. Jika sebuah pernyataan memengaruhi nol baris, transaksi dibatalkan dan hasilnya menyertakan kesalahan.
Rollback dengan pemeriksaan penyimpangan
Buat rencana rollback dari baris aktif tepat sebelum penulisan dan simpan sebagai JSON. Sebelum membatalkan perubahan, pemeriksaan penyimpangan membandingkan fingerprint baris dan mengembalikan operasi yang barisnya telah berubah sejak itu.
Dibandingkan dengan
Merql menggabungkan data baris dari tiga snapshot. Alat ini membuat versi, menyinkronkan, atau memigrasikan database; semua itu merupakan tugas terkait.
| Alat | Keunggulan | Perbedaan dengan Merql |
|---|---|---|
| Dolt | KeunggulanDolt adalah database SQL yang dapat Anda fork, kloning, cabangkan, gabungkan, push, dan pull seperti repositori Git. Anda terhubung ke database ini seperti ke database MySQL lainnya, dan alat ini melacak asal-usul setiap sel. | Perbedaan dengan MerqlMerql mempertahankan database MySQL atau SQLite yang sudah Anda jalankan. Alat ini menyimpan tabel sebagai berkas snapshot JSON dan menggabungkan tiga snapshot, dengan snapshot base dipilih oleh Anda. |
| pt-table-sync | Keunggulanpt-table-sync menemukan dan memperbaiki perbedaan antara tabel MySQL, satu arah atau dua arah antarserver. Saat menyinkronkan replika, alat ini menerapkan perubahan pada sumber replikasi. | Perbedaan dengan MerqlDalam sinkronisasi dua arah, pt-table-sync memilih baris pemenang berdasarkan kolom konflik dan menyalin nilainya. Merql membandingkan kedua sisi dengan base bersama, menggabungkan perubahan pada kolom berbeda di baris yang sama, dan melaporkan perubahan yang tidak kompatibel sebagai konflik untuk Anda selesaikan. |
| sqldiff | Keunggulansqldiff membandingkan dua database SQLite dan mencetak skrip SQL yang mengubah database pertama menjadi yang kedua. Alat ini juga dapat menulis changeset biner untuk ekstensi sesi SQLite atau merangkum baris yang berubah per tabel. | Perbedaan dengan MerqlDiff dua arah tidak dapat mengetahui apakah satu sisi menambahkan baris atau sisi lainnya menghapusnya. Merql menambahkan snapshot base untuk menjawabnya, menggabungkan dua kumpulan perubahan, dan juga berfungsi dengan MySQL. |
| Doctrine Migrations | KeunggulanDoctrine Migrations memberi versi pada skema database Anda, sehingga perubahan skema dapat ditinjau dan diuji sebelum diterapkan ke produksi. | Perbedaan dengan MerqlMerql bukan alat migrasi skema. Alat ini menggabungkan data baris dan melaporkan kolom yang ditambahkan atau dihapus di antara snapshot, sedangkan perubahan skema tetap menjadi tanggung jawab Anda. |
Tanya jawab
Jawaban singkat dari dokumentasi Merql.
MySQL dan SQLite, melalui adaptor PDO atau mysqli. Untuk mesin database lain, buat kelas yang mengimplementasikan antarmuka Driver dan daftarkan dengan DriverFactory::register().
Bukan. Alat ini tidak memigrasikan skema, mereplikasi database, atau menyinkronkannya secara waktu nyata. Dengan tiga keadaan database sebagai masukan, alat ini menghasilkan keadaan keempat yang telah digabungkan dan mengidentifikasi konfliknya.
Saat kedua sisi mengubah kolom yang sama pada baris yang sama menjadi nilai berbeda, saat satu sisi memperbarui baris yang dihapus sisi lainnya, atau saat keduanya menyisipkan baris dengan kunci yang sama. Perubahan pada kolom berbeda dalam satu baris digabungkan tanpa konflik.
Tidak. Keduanya membaca berkas snapshot tersimpan, jadi hanya pengambilan snapshot dan penerapan hasil yang terhubung ke database.
Ya. Buat rencana merge, pilih grup perubahan berdasarkan ID-nya, lalu ubah pilihan tersebut menjadi hasil bersih untuk Merql::apply() atau Merql::applyGuarded().
Hanya jika Anda memilih untuk mengaktifkannya dengan membuat ThreeWayMerge menggunakan CellMergeConfig, seperti CellMergeConfig::auto(). Merql::merge(), Merql::plan(), dan CLI memperlakukan setiap nilai kolom sebagai satu kesatuan.
Ikuti panduan mulai dari snapshot pertama hingga rencana penggabungan, penerapan dengan pengamanan, dan pemulihan.