Lewati ke konten

Pratinjau Dry Run

DryRun::generate() menghasilkan pernyataan SQL yang dapat dibaca manusia dengan nilai disisipkan langsung. Gunakan untuk meninjau tindakan penggabungan sebelum menerapkannya ke database.

PHP
use Merql\Apply\DryRun;

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}

Pratinjau berisi satu pernyataan untuk setiap operasi dalam hasil, dikelompokkan seperti cara Applier mengelompokkannya: penyisipan, lalu pembaruan, lalu penghapusan. Untuk seluruh hasil penggabungan, itu mencakup setiap perubahan dari kedua sisi terhadap base, yang akan dijalankan Merql::apply() pada database yang masih berisi base. Pratinjau hasil terpilih untuk melihat hanya pernyataan bagi operasi yang akan Anda terapkan.

Contoh keluaran

Sql
INSERT INTO `posts` (`id`, `title`, `content`, `status`) VALUES ('42', 'New Post', 'Body text', 'draft');
UPDATE `posts` SET `title` = 'Updated Title', `status` = 'publish' WHERE `id` = '42';
DELETE FROM `posts` WHERE `id` = '99';

Pembaruan menetapkan setiap kolom non-identitas yang dibawa operasi, bukan hanya kolom yang berubah, dan pembaruan yang tidak akan menetapkan kolom apa pun akan diabaikan.

Pemformatan nilai

Semua nilai dibungkus dengan tanda kutip tunggal. Karakter khusus di-escape agar aman ditampilkan:

Karakter Di-escape sebagai
\ (garis miring terbalik) \\
' (tanda kutip tunggal) ''
\0 (byte null) \0
\n (baris baru) \n
\r (carriage return) \r

Nilai NULL ditampilkan sebagai literal NULL tanpa tanda kutip:

Sql
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';

Parameter

DryRun::generate() menerima parameter yang sama dengan SqlGenerator::generate():

PHP
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
Parameter Jenis Deskripsi
$result MergeResult Hasil penggabungan yang akan dipratinjau.
$base ?Snapshot Snapshot base untuk kolom identitas. Default-nya $result->baseSnapshot().
$fkDependencies array Peta dependensi kunci asing untuk pengurutan.
$driver ?Driver Driver database untuk mengutip identifier.

Dry run vs SqlGenerator

DryRun membungkus SqlGenerator. Perbedaannya:

  • SqlGenerator::generate() mengembalikan array ['sql' => '...', 'params' => [...]] untuk eksekusi pernyataan yang disiapkan oleh adaptor.
  • DryRun::generate() mengembalikan string datar dengan nilai disisipkan langsung, agar mudah dibaca.

Jangan jalankan keluaran dry run sebagai SQL. Formatnya untuk ditampilkan, bukan untuk eksekusi yang aman. Untuk menjalankan penggabungan, gunakan Applier atau SqlGenerator secara langsung dengan pernyataan yang disiapkan.

Menggunakan facade

Melalui facade, ambil hasil penggabungan lalu pratinjau:

PHP
use Merql\Merql;
use Merql\Apply\DryRun;

$result = Merql::merge('base', 'ours', 'theirs');

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}

Atau dari CLI dengan flag --dry-run:

Shell
vendor/bin/merql merge base ours theirs --dry-run

CLI mencetak pernyataan tanpa pengurutan kunci asing atau driver, sehingga identifier menggunakan pengutipan backtick default apa pun databasenya. Komponen ini meneruskan snapshot base untuk kolom identitas. Penggabungannya bekerja pada tingkat kolom, seperti Merql::merge().