import sqlite3 import os from datetime import datetime DB_PATH = 'data/scud_orion_ai.db' def parse_to_date(date_str): """Надежное преобразование даты логов и времени снапшота в объект date.""" if not date_str: return None date_str = str(date_str).split(" ")[0].strip() if "." in date_str: try: return datetime.strptime(date_str, "%d.%m.%Y").date() except ValueError: return None elif "-" in date_str: try: return datetime.strptime(date_str, "%Y-%m-%d").date() except ValueError: return None return None def fix_snapshots(): """ Переиндексирует снапшоты в таблице scud_logs. Нумерация веников (001, 002, 003...) сквозная внутри каждого ДНЯ СОЗДАНИЯ. Префикс Y выставляется только если дата логов < даты создания. """ if not os.path.exists(DB_PATH): print(f"База данных {DB_PATH} не найдена.") return conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() # Группируем по уникальным выгрузкам cursor.execute(""" SELECT snapshot_time, log_date FROM scud_logs WHERE snapshot_time IS NOT NULL GROUP BY snapshot_time, log_date ORDER BY snapshot_time ASC, log_date ASC """) rows = cursor.fetchall() if not rows: print("Снапшоты не найдены.") conn.close() return print("=== ИСПРАВЛЕНИЕ СКВОЗНОЙ НУМЕРАЦИИ ВНУТРИ ДНЯ СОЗДАНИЯ ===") # Счетчик текущего порядкового номера strictly за ДЕНЬ СОЗДАНИЯ (YYYYMMDD) seq_counters = {} for snap_time_raw, log_date_raw in rows: d_snap = parse_to_date(snap_time_raw) d_log = parse_to_date(log_date_raw) if not d_snap or not d_log: continue date_prefix = d_snap.strftime("%Y%m%d") # Если дата логов строго раньше даты создания снапшота — ставим Y is_yesterday = (d_log < d_snap) prefix = "Y" if is_yesterday else "" # Приращиваем сквозной счетчик за ЭТОТ ДЕНЬ СОЗДАНИЯ seq_counters[date_prefix] = seq_counters.get(date_prefix, 0) + 1 seq_num = seq_counters[date_prefix] new_id = f"{prefix}{date_prefix}-{seq_num:03d}" cursor.execute( "UPDATE scud_logs SET snapshot_id = ? WHERE snapshot_time = ? AND log_date = ?", (new_id, snap_time_raw, log_date_raw) ) print(f" • Срез создания: {snap_time_raw} | Логи за: {log_date_raw} ===> Назначен ID: [{new_id}]") conn.commit() conn.close() print("\n[✓] Переиндексация внутри дней создания успешно выполнена!") if __name__ == "__main__": fix_snapshots()