You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.0 KiB
89 lines
3.0 KiB
10 months ago
|
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)
|