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.
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
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:
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
Parameter
DryRun::generate() akzeptiert dieselben Parameter wie SqlGenerator::generate():
$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:
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:
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().