php 数据库结构对比,php数据库比较工具分享

本文主要和大家分享php数据库比较工具,版本迭代需要对比不同版本的数据库,为低版本的数据库编写升库脚本。使用php编写数据库比较工具。没有用过php耗时一天。

功能:比较两个不同版本的数据库src和dst, 生成SQL文件 将src升级为dst<?phpdefine ("DSN",'mysql:host=127.0.0.1;port=3306;dbname=gmsys');//gm数据库配置define("SRC_DB","ea_role");

define("TARGET_DB","game_role");

define("USER","LiMing");

define("PASS","");

define("FILE_NAME","updateSQL.sql");//获取数据库结构//数据库名称,链接,返回所有表,所有表的结构>,表的属性值function getDBStructure($db_name,$pdo,&$tables,&$db_stru,&$table_status){

# code...

//获取SRC_DB 的数据库结构

$pdo->query("use ".$db_name);

print_r("

");    //表属性

foreach ($pdo->query("show table status") as $key => $value) { # code...

$table_status[$value[0]] = $value;

} //echo PHP_EOL;

foreach ($pdo->query("show tables") as $key => $value) { # code...

$tables[$key] = $value[0];//表名

//echo $value[0]."|";

} //echo PHP_EOL;

foreach ($tables as $key => $name) { # code...

//echo $name .PHP_EOL;

$table = null;//记得初始化

foreach ($pdo->query("desc ".$name) as $key => $value) { # code...

$table[$value[0]] = $value; //字段名 ——> 字段属性

//echo $value[0] ."|";

} //echo PHP_EOL;

$db_stru[$name] = $table; //表名 -> 表结构

}

}//生成创建数据库的sql// 表名 表结构function createTableSQl($name,$table){

# code...

$pri_key = array(); $mul_key = array(); $sql = "CREATE TABLE `{$name}` ("; foreach ($table as $key => $value) { # code...

$field = $value[0];//字段名

$type = $value[1]; //字段类型

$null = $value[2]; //是否为空 YES NO

$key = $value[3]; //PRI MUL

$default = $value[4]; //字段类型

$extal = $value[5];//

$isNUll = ""; if ($null == "YES") { # code...

$isNUll = "not null";

} //$defaultMsg = $default;

if (!is_null($default)) { # code...

$default = " default {$default}";

} if ($key == "PRI") { # code...

array_push($pri_key, $field);

} else if ($key == "MUL") { # code...

array_push ($mul_key, $field);

} //拼接字符串

$row = "`{$field}` {$type} {$isNUll} {$default},"; $sql = $sql . PHP_EOL . $row ;

} //添加主键

if (!empty($pri_key)) { # code...

$sql = $sql . PHP_EOL."PRIMARY KEY ("; foreach ($pri_key as $v) { # code...

$sql = $sql."`{$v}`,";

} $sql = substr($sql, 0,strlen($sql)-1); $sql = $sql . ")," ;

} //拼接主键

if (!empty($mul_key)) { # code...

foreach ($mul_key as $v) { # code...

$sql = $sql . PHP_EOL . "key `{$v}` ({$v}),";

}

} $sql = substr($sql, 0,strlen($sql)-1);//去掉最后一个‘,’

$sql = $sql . PHP_EOL . ");".PHP_EOL; return $sql;

}//生成update文件// $fields //ALTER TABLE `familyer` ADD COLUMN `joinfightdata` blob AFTER `ssfightblob`;function genUpdateSQL($fields){

$updateSql=null ; foreach ($fields as $tab_name => $value) { # code...

foreach ($value as $key => $v) { # code...

$isNUll = ""; if ($v[2] == "YES") { # code...

$isNUll = "NOT NULL";

} $default = $v[4]; if (!is_null($default)) { # code...

$default = " default {$default}";

} $updateSql = $updateSql . "ALTER TABLE `{$tab_name}` ADD COLUMN `{$v[0]}` {$v[1]} {$isNUll} {$default};".PHP_EOL;

} $updateSql = $updateSql.PHP_EOL;

} return $updateSql;

}//比价数据库结构//dst_db 有 src_db 没有 返回表字段数组function cmp($src_db,$dst_db){

$tables =array();//dst有 但是src中没有的表

$fields = array();//表名 ->

foreach ($dst_db as $key => $value) { # code...

if ( array_key_exists($key,$src_db) ) {//如果存在比较字段

# code...

$tmp = array_diff_key($value,$src_db[$key]); if ( !empty($tmp) ) { # code...

$fields[$key]=$tmp;

}

} else

array_push($tables,$key);

} return $fields;

}$pdo = new PDO(DSN, USER, PASS);//创建数据库链接//源数据库结构$src_tables= NULL;//表名数组$src_db = NULL; //数据库结构 表名->表字段$src_table_status = NULL; //表属性 name -> 属性getDBStructure(SRC_DB,$pdo,$src_tables,$src_db,$src_table_status);//目的数据库结构$dst_tables =NULL;$dst_db=null;$dst_table_status=null;

getDBStructure(TARGET_DB,$pdo,$dst_tables,$dst_db,$dst_table_status);$cmp_table = array_diff($dst_tables,$src_tables);$cmp_fields = cmp($src_db,$dst_db);//print_r($cmp_table);$text = null;foreach ($cmp_table as $value) { # code...

if ( !strchr($value,"pvprankreward") ) { # code...

$text = $text.createTableSQl($value,$dst_db[$value]);

}

}$text = $text . genUpdateSQL($cmp_fields);$myfile = fopen(FILE_NAME,"w");

fwrite($myfile, $text);

fclose($myfile);//对比数据库结构 返回差异 表//cmp($dst_db,$src_db);//对比表结构返回有差异的表//$str = createTableSQl($src_tables[0],$src_db[$src_tables[0]]);//$myfile = fopen("SQL.sql","w");//fwrite($myfile, $str);//fclose($myfile);// print_r("

");//print_r($src_db["pvprankreward170525"]);//print_r($src_table_status["role"]);?>

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值