Zum Inhalt springen

Vorschau für Probelauf

DryRun::generate() erzeugt menschenlesbare SQL-Anweisungen mit direkt eingefügten Werten. Damit kannst du prüfen, was eine Zusammenführung bewirken würde, bevor du sie auf die Datenbank anwendest.

PHP
use Merql\Apply\DryRun;

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

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

Die Vorschau enthält für jede Operation im Ergebnis eine Anweisung, gruppiert wie von Applier: zuerst Einfügungen, dann Aktualisierungen, dann Löschungen. Das vollständige Ergebnis einer Zusammenführung umfasst alle Änderungen beider Seiten gegenüber der Basis, also genau das, was Merql::apply() in einer Datenbank ausführen würde, die noch den Basiszustand enthält. Zeige eine ausgewählte Ergebnisversion an, um nur die Anweisungen für die geplanten Operationen zu sehen.

Beispielausgabe

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';

Aktualisierungen setzen alle Nicht-Identitätsspalten, die die Operation enthält, nicht nur die geänderten. Eine Aktualisierung, die keine Spalte setzen würde, wird ausgelassen.

Formatierung der Werte

Alle Werte stehen in einfachen Anführungszeichen. Sonderzeichen werden für eine sichere Anzeige maskiert:

Zeichen Maskiert als
\ (Backslash) \\
' (einfaches Anführungszeichen) ''
\0 (Nullbyte) \0
\n (Zeilenumbruch) \n
\r (Wagenrücklauf) \r

NULL-Werte werden als unquoted Literal NULL dargestellt:

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

Parameter

DryRun::generate() akzeptiert dieselben Parameter wie SqlGenerator::generate():

PHP
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
Parameter Typ Beschreibung
$result MergeResult Das Ergebnis der Zusammenführung für die Vorschau.
$base ?Snapshot Basis-Snapshot für Identitätsspalten. Fällt auf $result->baseSnapshot() zurück.
$fkDependencies array Abbildung der Fremdschlüsselabhängigkeiten für die Reihenfolge.
$driver ?Driver Datenbanktreiber zum Maskieren von Bezeichnern.

Probelauf und SqlGenerator

DryRun umschließt SqlGenerator. Der Unterschied:

  • SqlGenerator::generate() gibt ['sql' => '...', 'params' => [...]]-Arrays für die Ausführung mit vorbereiteten Adapter-Anweisungen zurück.
  • DryRun::generate() gibt flache Zeichenfolgen mit eingefügten Werten zurück, die für Menschen lesbar sind.

Führe die Ausgabe des Probelaufs nicht als SQL aus. Sie ist für die Anzeige formatiert, nicht für eine sichere Ausführung. Verwende zum Ausführen von Zusammenführungen direkt Applier oder SqlGenerator mit vorbereiteten Anweisungen.

Mit der Fassade verwenden

Erfasse über die Fassade ein Zusammenführungsergebnis und zeige eine Vorschau an:

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";
}

Oder über CLI mit dem Flag --dry-run:

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

CLI gibt die Anweisungen ohne Fremdschlüsselreihenfolge oder Treiber aus. Daher werden Bezeichner unabhängig von der Datenbank standardmäßig mit Backticks maskiert. Die Basis-Snapshot wird für Identitätsspalten übergeben. Die Zusammenführung erfolgt auf Spaltenebene wie bei Merql::merge().