mysqldiff——用Python實現的一款輕量級資料庫對比更新神器!
mysqldiff是一個能夠方便於大家在實際專案中快速生成不同版本資料庫之間的差異SQL,同時還能夠自動將新版中新增表中預設資料一併匯入到舊版本中。
1. 主要功能
mysql雖然提供了mysqldiff工具,但實際使用中還有些不滿足要求的地方,且在Linux下一般都帶有python環境,所以用python寫了一個。
- 比對兩個資料庫的差異;
- 比對兩張表的差異;
- 支援外來鍵的處理;
- 自動忽略表字段的順序差異;
- 支援表或列的重新命名;
- 支援同步新增表中資料;
- 支援舊錶中的資料匯入到新增表中;
- 將生成的差異sql儲存到檔案或者自動執行;
- 記錄錯誤日誌,出錯時方便排查。
2. 使用方法
mysqldiff.py用ofollow,noindex">web.py 作為連線資料庫的工具,因此在使用之前要確保環境中已經安裝web.py模組,如果沒有安裝,可以使用下面的命令進行安裝:
pip install web.py
命令格式:
python mysqldiff.py [param1] [param2] { [param3]....}
引數說明:
-
-x
自動執行差異SQL語句,預設不執行。 -
-c
是否插入新增表中的預設資料 -
s=[user]:[pass]@[host]:[port]
當兩個資料庫的連線配置相同時可以用該引數,否則用下面的sn和so分別指明。
user:使用者名稱
pass:密碼
host:ip地址
port:埠 -
so=[user]:[pass]@[host]:[port]
資料庫配置。 -
sn=[user]:[pass]@[host]:[port]
被參照的資料庫配置。 -
[db_new]{.[table_name]}:[db_old]{.[table_name]}
資料庫名.表名,不指名錶名時對比整個資料庫。 -
file=[diff_file]
差異化sql儲存位置,預設儲存在diff.sql檔案中。
示例:對比db_new和db_old兩個資料庫中的表結構差異,並將sql語句儲存到diff.sql中,同時直接執行sql語句:
python mysqldiff.py -x s=comclay:[email protected]:3306 db_new:db_old file=diff.sql
3.map.config
對映關係配置
map.config檔案中包含重新命名和資料匯入的配置
重新命名配置用->
表示:
# 重新命名 # oldtable -> newtable # oldtable.oldcol -> newtable.newcol # oldtable.[oldcol1, oldcol12, oldcol3 ......] -> newtable.[newcol1, newcol2, newcol3 ......] course_old -> course user.name -> user_new.username
資料匯入配置用=>
表示:
# 資料匯入 # oldtable => newtable # oldtable.[oldcol1, oldcol12, oldcol3 ......] => newtable.[newcol1, newcol2, newcol3 ......] course_old.[id, user_id] => user_course.[course_id, user_id]
4. 資料庫對比
db_old資料庫中只包含user表:

image
db_new資料庫中新增了course,並添加了一個外來鍵約束:

image

image
使用下方命令進行差異化對比:
python mysqldiff.py -c s=comclay:[email protected]:3306 db_new:db_old
生成的diff.sql如下:
/****************************** 關閉外來鍵約束 ******************************/ SET FOREIGN_KEY_CHECKS=0; /****************************** course ******************************/ CREATE TABLE `course` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `course` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `grade` int(11) DEFAULT '0', PRIMARY KEY (`id`), KEY `fk` (`user_id`), CONSTRAINT `fk` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; INSERT INTO course (grade, course, user_id, id) VALUES (60, 'english', 1, 1); /****************************** 開啟外來鍵約束 ******************************/ SET FOREIGN_KEY_CHECKS=1;