import os import pymysql from update.utils.git_util import GitUtil class DbCompare: def __init__(self, target_ip, _release): self.target_server = target_ip self.target_user = 'test' self.target_pwd = 'cine123456' self.target_port = '3306' self.target_release = _release self.diff_sql_path = '' self.diff_sql_tmp_path = '' # 生成对比文件 def gen_diff_file(self): serv_host = '127.0.0.1' serv_user = 'dingxin' serv_pwd = 'cine123456' serv_port = '3306' server_1 = f'--server1={serv_user}:{serv_pwd}@{serv_host}:{serv_port}' server_2 = f'--server2={self.target_user}:{self.target_pwd}@{self.target_server}:{self.target_port}' git_util = GitUtil() db_name = git_util.get_db_name(self.target_release) self.diff_sql_path = '../../dx/temp/diff_' + self.target_server + '.sql' self.diff_sql_tmp_path = '../../dx/temp/temp_' + self.target_server + '.sql' cmd = f'mysqldiff {server_1} {server_2} --changes-for=server2 --difftype=sql --force --quiet --skip-table-options {db_name}:cine > {self.diff_sql_tmp_path}' print(cmd) result = os.system(cmd) print(result) return self.diff_sql_path # 生成差异sql def gen_diff_sql(self): diff_sql_list = [] diff_file = open(self.diff_sql_path, 'w', encoding='utf-8') with open(self.diff_sql_tmp_path, 'r', encoding='utf-8') as tmp_f: for line in tmp_f.readlines(): if line.startswith('#'): continue if line == '': continue diff_file.write(line) tmp_f.close() diff_file.close() with open(self.diff_sql_path, 'r', encoding='utf-8') as diff_f: content = diff_f.read() temp = content.split(';') for sql in temp: diff_sql_list.append(sql + ';') diff_f.close() print(diff_sql_list) return diff_sql_list # 生成新表sql def gen_create_sql(self): create_sql_list = [] with open(self.diff_sql_tmp_path, 'r', encoding='utf-8') as f: for line in f.readlines(): if line.startswith('# TABLE'): create_sql_list.append(line.split(':')[1].strip()) print(create_sql_list) return create_sql_list # 执行差异 def exec_diff_sql(self): self.gen_diff_file() diff_sql = self.gen_diff_sql() create_sql = self.gen_create_sql() all_sql = diff_sql + create_sql db_config = { 'host': self.target_server, 'username': self.target_user, 'password': self.target_pwd, 'port': self.target_port, 'database': 'cine', } db_conn = pymysql.Connect(**db_config) db_cursor = db_conn.cursor() for sql in all_sql: result = db_cursor.execute(sql) print(result)