JavaScriptを有効にしてください

PHP で Database の Tableを丸ごとコピー

 ·  ☕ 2 分で読めます

PHP で Database の Tableを丸ごとコピー

テストをする際にテスト用のDBを整備するのが面倒だったのでPHPでDatabaseのTable定義を使用してテーブルのコピーを作成するようにしました。
PHPUnitを使用する際など一々Databaseを整備する必要がなくなるのでとても有用で PHPUnit 実行前に行うと整備する手間がなくなります。

Database Copy

使用するDBユーザーに権限がなければ失敗しますので使用する場合はDBの権限に気をつけてください。
mysql を使用していますので違うDBを使用するのであれば気をつけてください。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
<?php

/**
 * Database Copy
 */
class DatabaseCopy
{

    /**
     * DataBase Type
     * 
     * @var string
     */
    public $db = 'mysql';

    /**
     * Database Host
     * 
     * @var string
     */
    public $dbhost = 'localhost';

    /**
     * DataBase Port
     * 
     * @var string
     */
    public $dbport = '3306';

    /**
     * DataBase Name
     * 
     * @var string
     */
    public $dbname = 'develop';

    /**
     * Database charset
     * 
     * @var string
     */
    public $charset = 'utf-8';

    /**
     * Database User Name
     * 
     * @var string
     */
    public $user = 'db-user';

    /**
     * Database Password
     * 
     * @var string
     */
    public $password = 'db-password';

    /**
     * DataBase Execute
     * 
     * @param string $testDb
     * @return void
     */
    public function exe(string $testDb) : void
    {
        // コピー元のDBへ接続
        $dsn = "{$this->db}:host={$this->dbhost};port={$this->dbport};dbname={$this->dbname};charset={$this->charset}";
        $pdoOrigin = new PDO($dsn, $this->user, $this->password, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        ]);

        // コピー先のDBがあれば削除
        $pdoOrigin->query('drop database if exists ' . $testDb);
        // コピー先のDBを作成
        $pdoOrigin->query('create database ' . $testDb);

        // コピー先のDBの接続
        $dsn = "{$this->db}:host={$this->dbhost};port={$this->dbport};dbname={$testDb};charset={$this->charset}";
        $pdoCopy = new PDO($dsn, $this->user, $this->password, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        ]);

        // DB一覧を取得
        $rows = $pdoOrigin->query('show tables')->fetchAll(PDO::FETCH_ASSOC);
        $column = 'Tables_in_' . $this->dbname;

        // Table Copy
        foreach ($rows as $value) {
            // Create SQL 取得
            $createSql = $pdoOrigin->query('show create table ' . $value[$column])->fetchAll(PDO::FETCH_ASSOC);

            // Table 削除
            $pdoCopy->query('drop table if exists  ' . $createSql[0]['Table']);

            // Table 作成
            $pdoCopy->query($createSql[0]['Create Table']);

            // AUTO_INCREMENT をリセット
            if (strpos($createSql[0]['Create Table'], 'AUTO_INCREMENT') !== false) {
                $pdoCopy->query('alter table ' . $createSql[0]['Table'] . ' auto_increment = 1');
            }
        }
    }
}

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer