From 605390b53d68ddcb6a1806b7ce8e54a678b241a3 Mon Sep 17 00:00:00 2001 From: Bertazzi110 <58953301+Bertazzi110@users.noreply.github.com> Date: Fri, 15 May 2026 11:25:12 -0300 Subject: [PATCH] commit --- config.json.exemple | 25 ------------------------- sinc-db.bat | 2 -- sincronizacao.log | 29 +++++++++++++++++++++++++++++ sync-db-gui.py | 20 +++++++++++++++----- sync-db.bat | 2 ++ sync-db.py | 21 ++++++++++++++++----- 6 files changed, 62 insertions(+), 37 deletions(-) delete mode 100644 config.json.exemple delete mode 100644 sinc-db.bat create mode 100644 sync-db.bat diff --git a/config.json.exemple b/config.json.exemple deleted file mode 100644 index 8faad7b..0000000 --- a/config.json.exemple +++ /dev/null @@ -1,25 +0,0 @@ -{ - "settings": { - "mysql_bin_path": "C:\\xampp\\mysql\\bin", - "default_csv_file": "tabelas_puxar.csv", - "log_file": "sincronizacao.log" - }, - "origem": { - "alias": "PROD", - "host": "", - "user": "", - "password": "", - "database": "", - "port": 3306, - "charset": "" - }, - "destino": { - "alias": "DEV", - "host": "localhost", - "user": "root", - "password": "1", - "database": "", - "port": 3306, - "charset": "" - } -} \ No newline at end of file diff --git a/sinc-db.bat b/sinc-db.bat deleted file mode 100644 index 1734044..0000000 --- a/sinc-db.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -python "C:\Users\Neto\Desktop\sinc tabelas producao\database_table_cloning_tool\sync-db.py" %* \ No newline at end of file diff --git a/sincronizacao.log b/sincronizacao.log index e69de29..3117b77 100644 --- a/sincronizacao.log +++ b/sincronizacao.log @@ -0,0 +1,29 @@ +2026-05-15 11:16:13 | INFO | === SINC: PROD LEITURA ➔ Banco Local === +2026-05-15 11:16:13 | INFO | package: mysql.connector.plugins +2026-05-15 11:16:13 | INFO | plugin_name: mysql_native_password +2026-05-15 11:16:13 | INFO | AUTHENTICATION_PLUGIN_CLASS: MySQLNativePasswordAuthPlugin +2026-05-15 11:16:13 | ERROR | Tabela 'tabela1' não encontrada na origem (PROD LEITURA). +2026-05-15 11:16:13 | ERROR | Tabela 'tabela2' não encontrada na origem (PROD LEITURA). +2026-05-15 11:16:13 | ERROR | Tabela 'tabela3' não encontrada na origem (PROD LEITURA). +2026-05-15 11:16:14 | ERROR | Tabela 'tabela4' não encontrada na origem (PROD LEITURA). +2026-05-15 11:16:14 | ERROR | Tabela 'tabela5' não encontrada na origem (PROD LEITURA). +2026-05-15 11:16:34 | INFO | === SINC: PROD LEITURA ➔ Banco Local === +2026-05-15 11:16:34 | INFO | package: mysql.connector.plugins +2026-05-15 11:16:34 | INFO | plugin_name: mysql_native_password +2026-05-15 11:16:34 | INFO | AUTHENTICATION_PLUGIN_CLASS: MySQLNativePasswordAuthPlugin +2026-05-15 11:16:34 | ERROR | Erro em periodo: [WinError 2] O sistema não pode encontrar o arquivo especificado +2026-05-15 11:17:05 | INFO | === SINC: PROD LEITURA ➔ Banco Local === +2026-05-15 11:17:05 | INFO | package: mysql.connector.plugins +2026-05-15 11:17:05 | INFO | plugin_name: mysql_native_password +2026-05-15 11:17:05 | INFO | AUTHENTICATION_PLUGIN_CLASS: MySQLNativePasswordAuthPlugin +2026-05-15 11:17:05 | ERROR | Erro em periodo: [WinError 2] O sistema não pode encontrar o arquivo especificado +2026-05-15 11:17:12 | INFO | === SINC: PROD LEITURA ➔ Banco Local === +2026-05-15 11:17:12 | INFO | package: mysql.connector.plugins +2026-05-15 11:17:12 | INFO | plugin_name: mysql_native_password +2026-05-15 11:17:12 | INFO | AUTHENTICATION_PLUGIN_CLASS: MySQLNativePasswordAuthPlugin +2026-05-15 11:17:12 | ERROR | Erro em periodo: [WinError 2] O sistema não pode encontrar o arquivo especificado +2026-05-15 11:23:31 | INFO | === SINC: PROD LEITURA ➔ Banco Local === +2026-05-15 11:23:31 | INFO | package: mysql.connector.plugins +2026-05-15 11:23:31 | INFO | plugin_name: mysql_native_password +2026-05-15 11:23:31 | INFO | AUTHENTICATION_PLUGIN_CLASS: MySQLNativePasswordAuthPlugin +2026-05-15 11:23:32 | INFO | SUCCESS: periodo sincronizada. diff --git a/sync-db-gui.py b/sync-db-gui.py index e9d93a7..5fa08f6 100644 --- a/sync-db-gui.py +++ b/sync-db-gui.py @@ -32,6 +32,18 @@ def load_config(self): self.destino = self.config["destino"] self.mysql_bin = self.settings["mysql_bin_path"] + mysql_client = self.settings.get("mysql_client", "local") + if mysql_client == "docker": + _container = self.settings["docker_container"] + _bin = self.settings.get("docker_mysql_bin", "/usr/bin") + self.mysqldump_base_cmd = ["docker", "exec", "-i", _container, + f"{_bin}/{self.settings.get('docker_mysqldump_cmd', 'mysqldump')}"] + self.mysql_base_cmd = ["docker", "exec", "-i", _container, + f"{_bin}/{self.settings.get('docker_mysql_cmd', 'mysql')}"] + else: + self.mysqldump_base_cmd = [os.path.join(self.mysql_bin, "mysqldump.exe")] + self.mysql_base_cmd = [os.path.join(self.mysql_bin, "mysql.exe")] + def get_conn(self, cfg): params = cfg.copy() params.pop('alias', None) @@ -84,8 +96,7 @@ def sync_table(self, table, progress_callback): # Dump self.log(f"Baixando dados de {table}...") - dump_cmd = [ - os.path.join(self.mysql_bin, "mysqldump.exe"), + dump_cmd = self.mysqldump_base_cmd + [ "-h", self.origem['host'], "-u", self.origem['user'], f"-p{self.origem['password']}" ] if not needs_creation: dump_cmd.append("--no-create-info") @@ -104,9 +115,8 @@ def sync_table(self, table, progress_callback): # Import com Feedback self.log(f"Importando {table}...") file_size = os.path.getsize(temp_sql) - import_cmd = [ - os.path.join(self.mysql_bin, "mysql.exe"), - "-h", self.destino['host'], "-u", self.destino['user'], f"-p{self.destino['password']}", + import_cmd = self.mysql_base_cmd + [ + "-h", self.destino['host'], "-u", self.destino['user'], f"-p{self.destino['password']}", "--default-character-set=latin1", self.destino['database'] ] diff --git a/sync-db.bat b/sync-db.bat new file mode 100644 index 0000000..11aea9d --- /dev/null +++ b/sync-db.bat @@ -0,0 +1,2 @@ +@echo off +python "C:\scripts\database_table_cloning_tool\sync-db.py" %* \ No newline at end of file diff --git a/sync-db.py b/sync-db.py index 3070e0e..def1153 100644 --- a/sync-db.py +++ b/sync-db.py @@ -39,9 +39,20 @@ def load_config(): CONFIG = load_config() # Atalhos para facilidade -MYSQL_BIN_PATH = CONFIG["settings"]["mysql_bin_path"] -MYSQLDUMP_EXE = os.path.join(MYSQL_BIN_PATH, "mysqldump.exe") -MYSQL_EXE = os.path.join(MYSQL_BIN_PATH, "mysql.exe") +SETTINGS = CONFIG["settings"] +MYSQL_CLIENT = SETTINGS.get("mysql_client", "local") +MYSQL_BIN_PATH = SETTINGS["mysql_bin_path"] + +if MYSQL_CLIENT == "docker": + _container = SETTINGS["docker_container"] + _bin = SETTINGS.get("docker_mysql_bin", "/usr/bin") + _dump_cmd = SETTINGS.get("docker_mysqldump_cmd", "mysqldump") + _mysql_cmd = SETTINGS.get("docker_mysql_cmd", "mysql") + MYSQLDUMP_BASE_CMD = ["docker", "exec", "-i", _container, f"{_bin}/{_dump_cmd}"] + MYSQL_BASE_CMD = ["docker", "exec", "-i", _container, f"{_bin}/{_mysql_cmd}"] +else: + MYSQLDUMP_BASE_CMD = [os.path.join(MYSQL_BIN_PATH, "mysqldump.exe")] + MYSQL_BASE_CMD = [os.path.join(MYSQL_BIN_PATH, "mysql.exe")] # O arquivo CSV padrão e o LOG também ficam na pasta do script para serem centrais DEFAULT_CSV_FILE = os.path.join(SCRIPT_DIR, CONFIG["settings"]["default_csv_file"]) @@ -207,7 +218,7 @@ def sync_data(table, needs_creation=False): try: with open(temp_sql, "w", encoding='utf-8') as f: f.write(header_sql) - dump_cmd = [MYSQLDUMP_EXE, "-h", ORIGEM_CONFIG['host'], "-u", ORIGEM_CONFIG['user'], f"-p{ORIGEM_CONFIG['password']}"] + dump_cmd = MYSQLDUMP_BASE_CMD + ["-h", ORIGEM_CONFIG['host'], "-u", ORIGEM_CONFIG['user'], f"-p{ORIGEM_CONFIG['password']}"] if not needs_creation: dump_cmd.append("--no-create-info") dump_cmd.extend(["--complete-insert", "--skip-add-locks", "--skip-comments", "--single-transaction", "--quick", "--default-character-set=latin1", ORIGEM_CONFIG['database'], table]) @@ -224,7 +235,7 @@ def sync_data(table, needs_creation=False): # Import file_size = os.path.getsize(temp_sql) - import_cmd = [MYSQL_EXE, "-h", DESTINO_CONFIG['host'], "-u", DESTINO_CONFIG['user'], f"-p{DESTINO_CONFIG['password']}", "--default-character-set=latin1", DESTINO_CONFIG['database']] + import_cmd = MYSQL_BASE_CMD + ["-h", DESTINO_CONFIG['host'], "-u", DESTINO_CONFIG['user'], f"-p{DESTINO_CONFIG['password']}", "--default-character-set=latin1", DESTINO_CONFIG['database']] if HAS_RICH: with subprocess.Popen(import_cmd, stdin=subprocess.PIPE, stderr=subprocess.PIPE) as proc: