parent
b9df7114e8
commit
59f8ca151f
7 changed files with 6307 additions and 4 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,18 @@ |
||||
# Generated by Django 4.2.7 on 2024-01-08 03:12 |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('update', '0005_cinema_user'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='updatecommand', |
||||
name='process', |
||||
field=models.CharField(default='setup', help_text='执行顺序 setup 对比数据库前执行 teardown 对比数据库后执行', max_length=20, verbose_name='执行顺序'), |
||||
), |
||||
] |
@ -0,0 +1,49 @@ |
||||
import paramiko |
||||
from update.models import UpdateCommand |
||||
from django.db.models import Q |
||||
|
||||
|
||||
class UpdateCommandUtil: |
||||
def __init__(self, cinema_ip): |
||||
self.cinema_config = {'hostname': cinema_ip, 'port': 22, 'username': 'root', 'password': 'cine123456'} |
||||
self.client = paramiko.SSHClient() |
||||
self.model = UpdateCommand |
||||
|
||||
def connect(self): |
||||
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) |
||||
self.client.connect(**self.cinema_config) |
||||
|
||||
def disconnect(self): |
||||
self.client.close() |
||||
|
||||
def get_all_cmd(self): |
||||
return self.model.objects.order_by().all() |
||||
|
||||
def get_sys_cmd(self): |
||||
return self.model.objects.filter(is_sys='1').order_by(id).all() |
||||
|
||||
def get_no_sys_cmd(self): |
||||
return self.model.objects.exclude(is_sys='1').order_by(id).all() |
||||
|
||||
def get_checked_cmd(self, cmd_list): |
||||
sys_cmd = self.get_sys_cmd() |
||||
checked_cmd = self.model.objects.filter(id__in=cmd_list).order_by(id).all() |
||||
return sys_cmd + checked_cmd |
||||
|
||||
def exec_cmd(self, cmd_list, _release): |
||||
exec_cmd_list = self.get_checked_cmd(cmd_list) |
||||
for cmd in cmd_list: |
||||
if '<param>' in cmd: |
||||
cmd = cmd.replace('<param>', _release) |
||||
exec_cmd_list.append(cmd) |
||||
elif cmd.startswith('<multi>'): |
||||
cmd = cmd.replace('<multi>', _release) |
||||
for c in cmd.split('###'): |
||||
exec_cmd_list.append(c) |
||||
else: |
||||
exec_cmd_list.append(cmd) |
||||
self.connect() |
||||
for exec_cmd in exec_cmd_list: |
||||
stdin, stdout, stderr = self.client.exec_command(exec_cmd) |
||||
print(stdout.read().decode('utf-8')) |
||||
self.disconnect() |
@ -0,0 +1,88 @@ |
||||
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) |
Loading…
Reference in new issue