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');
}
}
}
}
|