Vai al contenuto

Anteprima dell'esecuzione simulata

DryRun::generate() produce istruzioni SQL leggibili con i valori interpolati direttamente. Usalo per controllare cosa farebbe un'unione prima di applicarla al database.

PHP
use Merql\Apply\DryRun;

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

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

L'anteprima contiene un'istruzione per ogni operazione del risultato, raggruppate come fa Applier: prima gli inserimenti, poi gli aggiornamenti e infine le eliminazioni. Per il risultato completo di un'unione, comprende tutte le modifiche di entrambi i lati rispetto alla base, ossia quelle che Merql::apply() eseguirebbe su un database che conserva ancora la base. Visualizza in anteprima un risultato selezionato per vedere solo le istruzioni relative alle operazioni che intendi applicare.

Esempio di output

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

Gli aggiornamenti impostano ogni colonna non d'identità inclusa nell'operazione, non solo quelle modificate; gli aggiornamenti che non imposterebbero alcuna colonna vengono omessi.

Formattazione dei valori

Tutti i valori sono racchiusi tra apici singoli. I caratteri speciali vengono sottoposti a escape per una visualizzazione sicura:

Carattere Forma con escape
\ (barra rovesciata) \\
' (apice singolo) ''
\0 (byte nullo) \0
\n (nuova riga) \n
\r (ritorno a capo) \r

I valori NULL vengono rappresentati con il letterale non racchiuso tra virgolette NULL:

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

Parametri

DryRun::generate() accetta gli stessi parametri di SqlGenerator::generate():

PHP
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
Parametro Tipo Descrizione
$result MergeResult Il risultato della fusione da visualizzare in anteprima.
$base ?Snapshot Snapshot di base per le colonne di identità. In mancanza, viene usato $result->baseSnapshot().
$fkDependencies array Mappa delle dipendenze delle chiavi esterne per l'ordinamento.
$driver ?Driver Driver del database per la corretta quotatura degli identificatori.

Esecuzione di prova e SqlGenerator

DryRun usa SqlGenerator come wrapper. La differenza è la seguente:

  • SqlGenerator::generate() restituisce array ['sql' => '...', 'params' => [...]] destinati all'esecuzione con prepared statement dell'adapter.
  • DryRun::generate() restituisce stringhe semplici con i valori incorporati, destinate alla lettura da parte delle persone.

Non eseguite l'output dell'esecuzione di prova come SQL. È formattato per la visualizzazione, non per un'esecuzione sicura. Per eseguire le fusioni, usate direttamente Applier o SqlGenerator con prepared statement.

Uso con la facciata

Tramite la facciata, acquisite il risultato della fusione e visualizzatene l'anteprima:

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

Oppure da CLI con il flag --dry-run:

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

CLI stampa le istruzioni senza ordinamento per chiave esterna né driver, quindi usa la quotatura predefinita con backtick per gli identificatori, indipendentemente dal database. Passa lo snapshot di base per le colonne di identità. La fusione opera a livello di colonna, come Merql::merge().