Merql
Saf PHP üç yönlü veritabanı birleştirmesi ve sütun düzeyinde çakışma çözümü. Git tarzı birleştirme anlamları MySQL ve SQLite tablolarına uygulanır.
composer require merql/merqlEn son sürüm 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']);Uygulamada
Birleştirme, kaydedilmiş üç anlık görüntüyü okur ve yazılacak işlemlerle çözülecek çakışmaları döndürür.
Üç anlık görüntüyü birleştirin
İki kopya ayrılmadan önce base anlık görüntüsünü alın, ardından her tarafın (örneğin canlı veritabanı ile korumalı alan kopyasının) anlık görüntüsünü alın. ThreeWayMerge, her iki tarafı base ile karşılaştırır ve iki değişiklik kümesini birleştirir.
Sonuç sekmesinde ours content, theirs ise aynı satırın title ve status alanlarını düzenledi; bu nedenle birleştirme, çakışma olmadan üç düzenlemeyi de korur.
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" }Üç Yönlü Birleştirme
Taban, bizimki, onlarınki. Metin satırları yerine anahtarlı veritabanı satırları ve sütunları üzerinde git tarzı üç yönlü birleştirme. İki dal arasındaki ekleme, güncelleme ve silmeleri algılar.
Sütun Düzeyinde Çözüm
Her iki taraf da aynı satırı değiştirdiğinde merql sütunları tek tek karşılaştırır. Yalnızca aynı sütun farklı değerlere değiştirildiyse çakışma bildirir.
İsteğe Bağlı Hücre Birleştirme
ThreeWayMerge'e bir CellMergeConfig geçirin; TEXT sütunlar Myers diff ile satır satır, JSON sütunlar anahtar anahtar birleştirilir. Merql facade ve CLI bunu etkinleştirmez.
Çoklu Veritabanı
Takılabilir bağlantı bağdaştırıcıları ve lehçe sürücüleri; yerleşik olarak MySQL ve SQLite ile.
Çakışma Algılama
Güncellemeye karşı güncelleme, güncellemeye karşı silme, silmeye karşı güncelleme ve eklemeye karşı ekleme; her biri tablo ve satır bilgisiyle bildirilir. Güncellemeye karşı güncelleme çakışmalarında sütun adı da belirtilir.
SQL Oluşturma
FK sıralamasıyla parametreli INSERT, UPDATE, DELETE ifadeleri. Deneme çalıştırması önizlemesi veya işlem içinde uygulama.
CLI
Komut satırından anlık görüntü alma, fark bulma ve birleştirme. Ortam değişkenleri aracılığıyla MySQL ve SQLite desteği sunar.
Test Edildi
Elle yazılmış beklentiler içeren 32 regresyon senaryosu (composer test:oracle). CI, 231 birim ve entegrasyon testlerini ve PHPStan düzey 10'u çalıştırır.
Merql neden tercih edilmeli
Anlık görüntüler dosyadır
Her anlık görüntü, makineler arasında kopyalayabileceğiniz veya sürüm denetimine kaydedebileceğiniz tek bir JSON dosyasıdır. Fark bulma ve birleştirme bu dosyaları okuduğundan veritabanı bağlantısı olmadan çalışır.
Yazmadan önce gözden geçirin
Birleştirme planı, her işleme ve değişiklik grubuna sabit bir kimlik verir ve base, ours, theirs ile sonuç satırlarını korur. İstediğiniz grupları seçip yalnızca bunları uygulayın.
Eskimiş planlar durdurulur
Korumalı uygulama yalnızca gözden geçirdiğiniz anlık görüntüyle eşleşen satırlara yazar. Bir ifade sıfır satırı etkilerse işlem geri alınır ve sonuç hata bilgisini içerir.
Sapma denetimiyle geri alma
Yazma işleminden hemen önceki canlı satırlardan bir geri alma planı oluşturun ve bunu JSON olarak saklayın. Geri almadan önce sapma denetimi satır parmak izlerini karşılaştırır ve o zamandan beri değişen satırların işlemlerini döndürür.
Karşılaştırma
Merql, üç anlık görüntüdeki satır verilerini birleştirir. Bu araçlar veritabanlarını sürümler, eşitler veya taşır; bunlar benzer amaçlı işlerdir.
| Araç | Şu konularda başarılı | Merql ile farkı |
|---|---|---|
| Dolt | Şu konularda başarılıDolt, çatallayabileceğiniz, klonlayabileceğiniz, dallara ayırabileceğiniz, birleştirebileceğiniz, gönderebileceğiniz ve çekebileceğiniz bir SQL veritabanıdır; tıpkı bir Git deposunda olduğu gibi. Herhangi bir MySQL veritabanına bağlandığınız gibi buna da bağlanırsınız ve her hücrenin kökenini izler. | Merql ile farkıMerql, zaten çalıştırdığınız MySQL veya SQLite veritabanını korur. Tabloları JSON anlık görüntü dosyaları olarak kaydeder ve base anlık görüntüsünü sizin seçtiğiniz üç dosyayı birleştirir. |
| pt-table-sync | Şu konularda başarılıpt-table-sync, MySQL tabloları arasındaki farkları tek yönde veya sunucular arasında iki yönde bulup giderir. Bir çoğaltıcıyı eşitlerken değişiklikleri çoğaltma kaynağında yapar. | Merql ile farkıİki yönlü eşitlemede pt-table-sync, çakışma sütununa göre kazanan satırı seçer ve değerlerini kopyalar. Merql ise her iki tarafı ortak bir base ile karşılaştırır, aynı satırın farklı sütunlarındaki düzenlemeleri birleştirir ve uyumsuz değişiklikleri çözmeniz için çakışma olarak bildirir. |
| sqldiff | Şu konularda başarılısqldiff, iki SQLite veritabanını karşılaştırır ve ilkini ikinciye dönüştüren bir SQL betiği yazdırır. Ayrıca SQLite oturum uzantısı için ikili değişiklik kümesi yazabilir veya tablo başına değişen satırları özetleyebilir. | Merql ile farkıİki yönlü fark, bir tarafın satır ekleyip eklemediğini veya diğer tarafın silip silmediğini belirleyemez. Merql bunu yanıtlamak için bir base anlık görüntüsü ekler, iki değişiklik kümesini birleştirir ve MySQL ile de çalışır. |
| Doctrine Migrations | Şu konularda başarılıDoctrine Migrations, veritabanı şemanızı sürümleyerek şema değişikliklerinin üretime alınmadan önce gözden geçirilip test edilmesini sağlar. | Merql ile farkıMerql bir şema taşıma aracı değildir. Satır verilerini birleştirir ve anlık görüntüler arasında eklenen veya kaldırılan sütunları bildirir; şema değişikliğini size bırakır. |
Kaynaklar, işaretli
Sorular ve yanıtlar
Merql dokümantasyonundan kısa yanıtlar.
MySQL ve SQLite, PDO veya mysqli bağdaştırıcıları aracılığıyla desteklenir. Başka bir motor için Driver arayüzünü uygulayan bir sınıf yazıp bunu DriverFactory::register() ile kaydedebilirsiniz.
Hayır. Şemaları taşımaz, veritabanlarını çoğaltmaz veya gerçek zamanlı eşitlemez. Üç veritabanı durumu verildiğinde çakışmaları belirlenmiş, birleştirilmiş dördüncü bir durum üretir.
Her iki taraf da aynı satırın aynı sütununu farklı değerlere değiştirdiğinde, taraflardan biri diğerinin sildiği bir satırı güncellediğinde veya ikisi de aynı anahtarla bir satır eklediğinde. Bir satırın farklı sütunlarındaki düzenlemeler sorunsuzca birleştirilir.
Hayır. Kaydedilmiş anlık görüntü dosyalarını okurlar; veritabanına yalnızca anlık görüntü alırken ve sonucu uygularken bağlanılır.
Evet. Birleştirme planı oluşturun, değişiklik gruplarını kimliklerine göre seçin ve seçimi Merql::apply() veya Merql::applyGuarded() için temiz bir sonuca dönüştürün.
Yalnızca ThreeWayMerge'i CellMergeConfig::auto() gibi bir CellMergeConfig ile oluşturarak bu özelliği etkinleştirirseniz. Merql::merge(), Merql::plan() ve CLI, her sütun değerini bir bütün olarak ele alır.
İlk anlık görüntünüzden birleştirme planlarına, korumalı uygulamaya ve geri almaya kadar kılavuzu izleyin.