Nette\Database a vytváření schématu databáze (exec SQL skriptu)
- thunderbuff
- Člen | 164
Pořebuji vytvořit databázi a její schéma přímo z PHP skriptu:
<?php
$dumpPath = __DIR__ . '/dbDump.sql';
if (!is_readable($dumpPath)) {
throw new \App\Exceptions\InvalidStateException('DATABASE DUMP CORRUPTED');
}
$createSchemeSQL = strtr(file_get_contents($dumpPath), array('%%%USERID%%%' => $entity->getId()));
$database = $this->connMan->getSchemeCreationConnection($entity); // Vrací connection s DSN bez vybrané databáze
$prep = $database->prepare($createSchemeSQL);
$prep->execute();
/*
Proměnná $createSchemeSQL obsahuje SQL export z admineru:
-- Adminer 3.6.1 MySQL dump
SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = 'SYSTEM';
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE DATABASE IF NOT EXISTS `app_user_%%%USERID%%%`
USE `app_user_%%%USERID%%%`;
SET @adminer_alter = '';
-- a dál tabulky s cizími klíči a triggery, žádná data
*/
?>
Když kód spustím, databáze se vytvoří, ale pouze s jedinou tabulkou – tou, která je v SQL exportu jako první. Nedojde k žádné chybě, jen se vytvoří pouze jedna tabulka. Kde může být probém?
(POkud vezmu dump a nacpu ho do konzole v admineru, funguje zcela správně)
Editoval thunderbuff (27. 3. 2013 16:00)
- Aurielle
- Člen | 1281
Netuším, jak to je v PDO, rychlý google našel toto: http://stackoverflow.com/…-pdo-mysqlnd. Při použití
mysqli extensionu přes mysqli_query()
nešlo spouštět více
dotazů zároveň, podobné omezení asi bude i tady. Nejjednodušší by tedy
bylo rozdělit dump na jednotlivé příkazy a jeden po druhém je
spouštět.
- thunderbuff
- Člen | 164
Díky za nakopnutí správným směrem. Statická metoda z Helpers se použít nedala, protože mé SQL obsahuje i triggery (které používají DELIMITER ;; a ten metoda neumí zpracovat). Ale napsal jsem si vlastní parser dělící skript na jednotlivé statementy, už mi to funguje. Díky!
Editoval thunderbuff (28. 3. 2013 0:27)