Я разрабатываю приложение PHP, которое должно быть в состоянии настроить базу данных проекта и обновить ее / ее определение данных, используя список файлов SQL. Вот первый наивный быстрый и грязный письменный процедурный прототип:
<?php function executeSQLFiles(array $dbOptions, array $dbFiles) { $dbConnection = mysqli_connect($dbOptions['host'], $dbOptions['user'], $dbOptions['password'], $dbOptions['database']); if (mysqli_connect_errno($dbConnection)) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } // db setup foreach ($dbFiles['setup'] as $listItem) { $query = file_get_contents(__DIR__ . '/../../config/database/' . $listItem['file']); $result = mysqli_multi_query($dbConnection, $query); if (!$result) { die($listItem['file'] . ': ' . 'Invalid query: ' . mysqli_error($dbConnection) . PHP_EOL); } else { echo $listItem['file'] . ' ' . 'OK' . PHP_EOL; } } // db migration }
Он работает для таблиц, но не работает для просмотров. Я не получаю никаких ошибок, представление просто не создается, и я получаю сообщение «filename.sql OK».
Представление, создающее SQL-скрипт (сгенерированное с помощью MySQL Workbench), в порядке. Когда я выполняю его в клиенте MySQL, создается представление.
-- ----------------------------------------------------- -- Placeholder table for view `allproviders` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `allproviders` (`id` INT, `providertype` INT, `providerid` INT, `displayedname` INT, `url` INT, `city_id` INT); SHOW WARNINGS; -- ----------------------------------------------------- -- View `allproviders` -- ----------------------------------------------------- DROP VIEW IF EXISTS `allproviders` ; SHOW WARNINGS; DROP TABLE IF EXISTS `allproviders`; SHOW WARNINGS; DELIMITER $$ CREATE OR REPLACE VIEW `allproviders` AS SELECT `providers`.`id`, `providers`.`type` AS `providertype`, `providers`.`providerid` AS `providerid`, `universities`.`displayedname`, `universities`.`url`, `universities`.`city_id` FROM `providers` JOIN `universities` ON `providers`.`providerid` = `universities`.`id` UNION SELECT `providers`.`id`, `providers`.`type` AS `providertype`, `providers`.`providerid` AS `providerid`, `partners`.`displayedname`, NULL `url`, `partners`.`city_id` FROM `providers` JOIN `partners` ON `providers`.`providerid` = `partners`.`id` $$ DELIMITER ; ; SHOW WARNINGS; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Я делаю что-то неправильно? Как заставить его работать?
Спасибо