ドライランのプレビュー
DryRun::generate()は、値をインラインで埋め込んだ、人が読みやすいSQL文を生成します。データベースに適用する前に、マージで何が行われるかを確認できます。
use Merql\Apply\DryRun;
$statements = DryRun::generate($result);
foreach ($statements as $sql) {
echo "{$sql};\n";
}
プレビューには、結果内の各操作に対応する文が含まれ、Applierと同じ順序で、挿入、更新、削除にグループ化されます。マージ全体の結果では、baseに対する両側のすべての変更が対象となり、baseの状態が保持されたデータベースに対してMerql::apply()が実行する内容が示されます。適用する予定の操作に対応する文だけを確認するには、選択した結果をプレビューしてください。
出力例
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';
更新では、操作に含まれる非識別列がすべて設定され、変更された列だけに限定されません。また、設定する列がない更新は省略されます。
値のフォーマット
すべての値はシングルクォートで囲まれます。安全に表示できるよう、特殊文字はエスケープされます:
| 文字 | エスケープ後 |
|---|---|
\ (バックスラッシュ) |
\\ |
' (シングルクォート) |
'' |
\0 (ヌル文字) |
\0 |
\n (改行) |
\n |
\r (キャリッジリターン) |
\r |
NULL値は、引用符で囲まないリテラルNULLとして出力されます:
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
パラメーター
DryRun::generate()はSqlGenerator::generate()と同じパラメーターを受け取ります:
$statements = DryRun::generate(
$result,
base: $baseSnapshot,
fkDependencies: ['comments' => ['posts']],
driver: new SqliteDriver(),
);
| パラメーター | 型 | 説明 |
|---|---|---|
$result |
MergeResult |
プレビューするマージ結果。 |
$base |
?Snapshot |
識別列用のベーススナップショット。$result->baseSnapshot()にフォールバックします。 |
$fkDependencies |
array |
順序付けに使用する外部キー依存関係マップ。 |
$driver |
?Driver |
識別子の引用符付けに使用するデータベースドライバー。 |
Dry runとSqlGeneratorの比較
DryRunはSqlGeneratorをラップします。違いは次のとおりです:
SqlGenerator::generate()は、アダプターによるプリペアドステートメント実行を目的とした['sql' => '...', 'params' => [...]]配列を返します。DryRun::generate()は、人が読めるように値を埋め込んだフラットな文字列を返します。
dry runの出力をSQLとして実行しないでください。これは表示用にフォーマットされており、安全な実行を目的としていません。マージを実行するには、ApplierまたはSqlGeneratorをプリペアドステートメントとともに直接使用してください。
ファサードでの使用
ファサード経由でマージ結果を取得し、プレビューします:
use Merql\Merql;
use Merql\Apply\DryRun;
$result = Merql::merge('base', 'ours', 'theirs');
$statements = DryRun::generate($result);
foreach ($statements as $sql) {
echo "{$sql};\n";
}
またはCLIから--dry-runフラグを使います:
vendor/bin/merql merge base ours theirs --dry-run
CLIは外部キーの順序付けやドライバー指定なしで文を出力するため、データベースにかかわらず識別子には既定のバッククォートによる引用符付けが使われます。識別列にはベーススナップショットが渡されます。マージはMerql::merge()と同様に列単位です。