#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script per il merge dei file comune.sql di IT e CH Aggiunge le colonne created_at, updated_at, nazione_id """ import re import os def parse_sql_file(file_path): """Parsa un file SQL e estrae le righe INSERT da tutte le query""" with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # Trova tutte le sezioni VALUES values_matches = re.findall(r'VALUES\s*(.*?);', content, re.DOTALL | re.IGNORECASE) if not values_matches: print(f"Errore: non trovo la sezione VALUES in {file_path}") return [] # Combina tutte le sezioni VALUES all_values_section = ',\n'.join(values_matches) # Estrae le righe individuali rows = [] # Pattern migliorato per matchare le righe con apostrofi escaped: (id, provincia_id, nome, codice_catastale, ...) # Gestisce sia apostrofi normali che escaped (\') pattern = r'\((\d+),\s*(\d+),\s*\'((?:[^\'\\]|\\.)*)\',\s*\'?([^\',]*)\'?' matches = re.findall(pattern, all_values_section) for match in matches: id_val, provincia_id, nome, codice_catastale = match # Decodifica gli apostrofi escaped nome = nome.replace("\\'", "'") rows.append({ 'id': int(id_val), 'provincia_id': int(provincia_id), 'nome': nome, 'codice_catastale': codice_catastale if codice_catastale != 'NULL' else None }) return rows def generate_merged_sql(it_rows, ch_rows, output_file): """Genera il file SQL di merge""" with open(output_file, 'w', encoding='utf-8') as f: f.write("INSERT INTO `comune` (\n") f.write(" `id`,\n") f.write(" `provincia_id`,\n") f.write(" `nome`,\n") f.write(" `codice_catastale`,\n") f.write(" `created_at`,\n") f.write(" `updated_at`,\n") f.write(" `nazione_id`\n") f.write(") VALUES\n") all_rows = [] # Processa righe IT (nazione_id = 118, created_at/updated_at = NULL) for row in it_rows: nome_escaped = row['nome'].replace("'", "\\'") codice = f"'{row['codice_catastale']}'" if row['codice_catastale'] else 'NULL' all_rows.append( f"({row['id']}, {row['provincia_id']}, '{nome_escaped}', {codice}, NULL, NULL, 118)" ) # Processa righe CH (nazione_id = 220, created_at/updated_at dal file originale) # Rinumera gli ID partendo da 110015 new_ch_id = 110015 for row in ch_rows: nome_escaped = row['nome'].replace("'", "\\'") codice = f"'{row['codice_catastale']}'" if row['codice_catastale'] else 'NULL' all_rows.append( f"({new_ch_id}, {row['provincia_id']}, '{nome_escaped}', {codice}, NULL, NULL, 220)" ) new_ch_id += 1 # Scrivi tutte le righe f.write(",\n".join(all_rows)) f.write(";\n") # Aggiungi statistiche f.write(f"\n-- Statistiche merge:\n") f.write(f"-- Comuni IT: {len(it_rows)} (ID originali, nazione_id = 118)\n") f.write(f"-- Comuni CH: {len(ch_rows)} (ID da {110015} a {110015 + len(ch_rows) - 1}, nazione_id = 220)\n") f.write(f"-- Totale comuni: {len(all_rows)}\n") def main(): # Percorsi dei file base_dir = os.path.dirname(os.path.abspath(__file__)) it_file = os.path.join(base_dir, 'it', 'comune.sql') ch_file = os.path.join(base_dir, 'ch', 'comune.sql') output_file = os.path.join(base_dir, 'comune_merged.sql') print("Inizio parsing file IT...") it_rows = parse_sql_file(it_file) print(f"Trovate {len(it_rows)} righe nel file IT") print("Inizio parsing file CH...") ch_rows = parse_sql_file(ch_file) print(f"Trovate {len(ch_rows)} righe nel file CH") print("Generazione file di merge...") generate_merged_sql(it_rows, ch_rows, output_file) print(f"File di merge generato: {output_file}") print(f"Totale righe nel file finale: {len(it_rows) + len(ch_rows)}") if __name__ == "__main__": main()