Skip to content

Instantly share code, notes, and snippets.

@stamm
Created April 4, 2012 16:59
Show Gist options
  • Save stamm/2303851 to your computer and use it in GitHub Desktop.
Save stamm/2303851 to your computer and use it in GitHub Desktop.
Copy db in
<?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