Мне нужно запустить несколько сценариев SQL для моей базы данных, чтобы обновить схему и данные (какая-то миграция).
Поскольку есть некоторая логика, которую нужно проверить перед запуском каждого сценария, я пишу небольшой инструмент PHP для выполнения сценариев, но у меня есть простая проблема: могу ли я загрузить и выполнить «простой» сценарий SQL (включая манипулирование таблицами, триггеры & непосредственно для хранимых процедур), или я должен добавить маркеры в сценарий (чтобы отметить, где заканчивается каждое предложение) и выполнить предложение сценария по предложению?
Для доступа к базе данных я использую PDO.
У меня была похожая ситуация сегодня.
Мое решение очень простое, но достаточно умное, чтобы учитывать комментарии и утверждения, которые занимают несколько строк.
// open script file
$scriptfile = fopen($script_path, "r");
if (!$scriptfile) { die("ERROR: Couldn't open {$scriptfile}.\n"); }
// grab each line of file, skipping comments and blank lines
$script = '';
while (($line = fgets($scriptfile)) !== false) {
$line = trim($line);
if(preg_match("/^#|^--|^$/", $line)){ continue; }
$script .= $line;
}
// explode script by semicolon and run each statement
$statements = explode(';', $script);
foreach($statements as $sql){
if($sql === '') { continue; }
$query = $pdo->prepare($sql);
$query->execute();
if($query->errorCode() !== '00000'){ die("ERROR: SQL error code: ".$query->errorCode()."\n"); }
}
Других решений пока нет …