SQL

Как выполнить MySQL миграцию и отследить результат выполнения?

В нашем примере миграция это файл содержащий SQL инструкции. Создадим файл file.sql:

SELECT * FROM test;
SELECT * FROM tesdt;
INSERT INTO test (id,name)
VALUES (2,'newname');

В той же директории создадим исполняемый php файл run.php для командной строки:

<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(E_ALL);

$db_user = '***';
$db_pass = '***';
$db_host = 'db4free.net';
$db_name = '***';
$migrationFilePath = 'file.sql';

$command = "mysql -u{$db_user} -p{$db_pass} -h {$db_host} -D {$db_name} -vv < {$migrationFilePath} 2>&1";
$output = exec($command, $migrateResult);

print_r('$output - '.$output.PHP_EOL);
print_r('$migrateResult: '.PHP_EOL);
print_r($migrateResult);

$result = false;

foreach ($migrateResult as $key => $value){//Если в output нет вхождения слова 'ERROR' тогда значит sql нормально отработал.
    if (strpos($value, 'ERROR') !== false){
        $resultInfo['errorMessage'] = $value;
    }
}
if (empty($resultInfo['errorMessage'])){
    $result = true;
}

print_r('$result: '.$result.PHP_EOL);
print_r('errorMessage: '.$resultInfo['errorMessage'].PHP_EOL);
echo PHP_EOL;

Откроем консоль нашего сервера, выполним команду php run.php

В результате в случае возникновения MySQL ошибки мы сохраним её в переменную, если SQL ошибки не произойдет тогда миграция будет считаться успешно выполненной.

Leave a reply