Created
April 4, 2012 16:59
-
-
Save stamm/2303851 to your computer and use it in GitHub Desktop.
Copy db in
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Копируем данные из одной базы в другую | |
*/ | |
class CopyTestDb { | |
/** @var array Таблицы, которые не будут копироватся */ | |
static private $skip = array(); | |
/** @var array Таблицы, у которых нужно скопировать только схему */ | |
static private $onlySchema = array(); | |
/** | |
* Копирование | |
* @static | |
* @param $from исходная база | |
* @param $to база, куда копируются | |
*/ | |
static public function copy($from, $to) { | |
//Удаляем имя базы, если есть, чтобы можно было использовать две базы сразу | |
$dsn = preg_replace('~;dbname[^;]+$~', '', Yii::app()->db->connectionString); | |
// Делаем коннекшен | |
$db = new CDbConnection($dsn, Yii::app()->db->username, Yii::app()->db->password); | |
$db->charset = Yii::app()->db->charset; | |
$from = $db->quoteTableName($from); | |
$to = $db->quoteTableName($to); | |
$db->createCommand('CREATE DATABASE IF NOT EXISTS ' . $to . ' CHARACTER SET utf8 COLLATE utf8_general_ci')->execute(); | |
//$db->createCommand('use ' . $from); | |
$transaction = $db->beginTransaction(); | |
try { | |
// Получаем список таблиц | |
$aTables = $db | |
->createCommand('SHOW FULL TABLES FROM ' . $from . ' WHERE table_type = "BASE TABLE";') | |
->queryColumn(); | |
foreach ($aTables as $sTable) { | |
// Пропускаем таблицу | |
if (in_array($sTable, static::$skip)) { | |
echo $sTable . ' - skip' . PHP_EOL; | |
continue; | |
} | |
echo $sTable . ' - drop if exists'. PHP_EOL; | |
$db->createCommand('DROP TABLE IF EXISTS ' . $to . '.' . $db->quoteTableName($sTable))->execute(); | |
echo $sTable . ' create'. PHP_EOL; | |
} | |
$sql = $db->createCommand('SHOW CREATE TABLE ' . $from . '.' . $db->quoteTableName($sTable))->queryAll(false); | |
$sql = $sql[0][1]; | |
$sql = str_replace('CREATE TABLE ', 'CREATE TABLE ' . $to . '.', $sql); | |
//$db->createCommand('use ' . $to)->execute(); | |
$db->createCommand($sql)->execute(); | |
// Если нужно скопировать только схему, то ... | |
if (in_array($sTable, static::$onlySchema)) { | |
// Отчищаем таблицу, чтобы id'шники пошли с начала | |
echo $sTable . ' - truncate' . PHP_EOL; | |
$db->createCommand('TRUNCATE TABLE ' . $to . '.' . $db->quoteTableName($sTable)) | |
->execute(); | |
} else { | |
echo $sTable . ' - INSERT SELECT' . PHP_EOL; | |
$sql = 'INSERT INTO ' . $to . '.' . $db->quoteTableName($sTable) . ' SELECT * FROM ' . $from . '.' . $db->quoteTableName($sTable); | |
$db->createCommand($sql)->execute(); | |
} | |
} | |
$transaction->commit(); | |
} catch (Exception $e) { | |
echo 'Ошибка: ' . $e->getMessage(); | |
$transaction->rollback(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment