├── .gitignore ├── README.md ├── migration.php ├── .idea └── vcs.xml ├── src ├── Inversion.php ├── Load.php ├── Db.php └── Build.php ├── composer.json └── test.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | vendor/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # phinx-ivn 2 | 对已有的数据库进行反转,转化为phinx迁移文件 3 | -------------------------------------------------------------------------------- /migration.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/Inversion.php: -------------------------------------------------------------------------------- 1 | migrationsPath = $config['save_path']; 20 | $inversion->pdo = $config['pdo']; 21 | $this->inversion = $inversion; 22 | } 23 | 24 | public function getBuild() 25 | { 26 | return new Build($this->inversion); 27 | } 28 | } -------------------------------------------------------------------------------- /test.php: -------------------------------------------------------------------------------- 1 | "; 18 | print_r($data); 19 | echo ""; 20 | } 21 | 22 | try { 23 | 24 | $pdo = new PDO("mysql:host=localhost;dbname=phalcon-pe", "root", "123456", array(PDO::ATTR_AUTOCOMMIT => 0)); 25 | $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 26 | 27 | } catch (PDOException $e) { 28 | 29 | echo "数据库连接失败:" . $e->getMessage(); 30 | exit; 31 | } 32 | 33 | $load = new \Inversion\Load([ 34 | 'pdo'=>$pdo, 35 | 'save_path'=>__DIR__.'/test/', 36 | ]); 37 | 38 | $build = $load->getBuild(); 39 | $build->run(); -------------------------------------------------------------------------------- /src/Db.php: -------------------------------------------------------------------------------- 1 | pdo = $pdo; 19 | } 20 | 21 | public function fetchAll($sql) 22 | { 23 | return $this->pdo->query($sql)->fetchAll(\PDO::FETCH_ASSOC); 24 | } 25 | 26 | public function getMyDbName() 27 | { 28 | $sql = "select database();"; 29 | $table = $this->pdo->query($sql)->fetchAll(\PDO::FETCH_ASSOC); 30 | return end($table[0]); 31 | } 32 | 33 | public function getFieldType() 34 | { 35 | $sql = "SELECT DATA_TYPE FROM information_schema.COLUMNS GROUP BY DATA_TYPE"; 36 | return $this->pdo->query($sql)->fetchAll(\PDO::FETCH_ASSOC); 37 | } 38 | } -------------------------------------------------------------------------------- /src/Build.php: -------------------------------------------------------------------------------- 1 | inversion = $inversion; 20 | $db = new Db($inversion->pdo); 21 | $this->db = $db; 22 | } 23 | 24 | /** 25 | * 开始生产 26 | */ 27 | public function run() 28 | { 29 | $list = $this->getAllTable(); 30 | $templateString = file_get_contents(__DIR__.'/../migration.php'); 31 | foreach ($list as $name){ 32 | $className = 'Create' . $name . 'Table'; 33 | $tableString = str_replace(['TemplateClassName','TemplateTableName'], [$className,$name], $templateString); 34 | 35 | $addComman = ''; 36 | foreach ($this->getDetail($name) as $value) { 37 | $is_key = false; 38 | // 是否为主键 39 | if( $value['COLUMN_KEY']=='PRI' ){ 40 | if( $value['EXTRA']=='auto_increment' ){ 41 | $tableOpt['id'] = $value['COLUMN_NAME']; 42 | $is_key = true; 43 | }else{ 44 | if( isset($tableOpt['id']) && $tableOpt['id'] ){ 45 | $tableOpt['primary_key'][] = $value['COLUMN_NAME']; 46 | }else{ 47 | $tableOpt['primary_key'][] = $value['COLUMN_NAME']; 48 | $tableOpt['id'] = false; 49 | } 50 | } 51 | }elseif ( $value['COLUMN_KEY']=='UNI' ){ 52 | // 记录索引-唯一索引 53 | $index[] = [ 54 | 'name'=>$value['COLUMN_KEY'], 55 | 'option'=>['unique'=>true,'name'=>''], 56 | ]; 57 | }elseif ( $value['COLUMN_KEY']=='MUL' ){ 58 | // 记录索引 59 | $index[] = [ 60 | 'name'=>$value['COLUMN_KEY'], 61 | 'option'=>[], 62 | ]; 63 | } 64 | 65 | if( $is_key==false ){ 66 | $addComman .= $this->setColumn($value); 67 | } 68 | } 69 | 70 | //file_put_contents(ROOT_PATH.'/database/migrations/'.date('YmdHis').'_create_'.strtolower($name).'_table.php',$tableString,LOCK_EX); 71 | 72 | } 73 | 74 | } 75 | 76 | private function setColumn($value) 77 | { 78 | switch ($value['DATA_TYPE']){ 79 | case 'bigint': 80 | $type = 'biginteger'; 81 | break; 82 | case 'blob': 83 | $type = 'blob'; 84 | break; 85 | case 'char': 86 | $type = 'uuid'; 87 | break; 88 | case 'datetime': 89 | $type = $value['DATA_TYPE']; 90 | break; 91 | case 'decimal': 92 | $type = $value['DATA_TYPE']; 93 | break; 94 | case 'double': 95 | $type = 'float'; 96 | break; 97 | case 'enum': 98 | $type = $value['DATA_TYPE']; 99 | break; 100 | case 'float': 101 | $type = $value['DATA_TYPE']; 102 | break; 103 | case 'int': 104 | $type = 'integer'; 105 | break; 106 | case 'longblob': 107 | $type = 'text'; 108 | break; 109 | case 'longtext': 110 | $type = 'text'; 111 | break; 112 | case 'mediumtext': 113 | $type = 'text'; 114 | break; 115 | case 'set': 116 | $type = $value['DATA_TYPE']; 117 | break; 118 | case 'smallint': 119 | $type = $value['DATA_TYPE']; 120 | break; 121 | case 'text': 122 | $type = $value['DATA_TYPE']; 123 | break; 124 | case 'time': 125 | $type = $value['DATA_TYPE']; 126 | break; 127 | case 'timestamp': 128 | $type = $value['DATA_TYPE']; 129 | break; 130 | case 'tinyint': 131 | $type = 'boolean'; 132 | break; 133 | case 'tinytext': 134 | $type = 'text'; 135 | break; 136 | case 'varchar': 137 | $type = 'string'; 138 | break; 139 | default: 140 | $type = $value['DATA_TYPE']; 141 | break; 142 | } 143 | dd($type); 144 | dd($value); 145 | } 146 | 147 | /** 148 | * 获取所有数据表 149 | */ 150 | public function getAllTable() 151 | { 152 | $sql = "show tables"; 153 | $list = $this->db->fetchAll($sql); 154 | foreach ($list as $item) { 155 | $table[] = end($item); 156 | } 157 | return $table; 158 | } 159 | 160 | public function getDetail($table) 161 | { 162 | $sql = "select * from information_schema.COLUMNS where TABLE_SCHEMA='" . $this->db->getMyDbName() . "' and TABLE_NAME='{$table}';"; 163 | $table = $this->db->fetchAll($sql); 164 | return $table; 165 | } 166 | } --------------------------------------------------------------------------------