#!/usr/bin/env python3 """ Миграция: Добавление колонки для ML-скоринга постов. Добавляет: - ml_scores (TEXT/JSON) - JSON с результатами оценки от разных моделей Структура ml_scores: { "deepseek": {"score": 0.75, "model": "deepseek-chat", "ts": 1706198400}, "rag": {"score": 0.90, "model": "rubert-base-cased", "ts": 1706198400} } """ import argparse import asyncio import os import sys from pathlib import Path # Добавляем корень проекта в путь project_root = Path(__file__).resolve().parent.parent sys.path.insert(0, str(project_root)) import aiosqlite # Пытаемся импортировать logger, если не получается - используем стандартный try: from logs.custom_logger import logger except ImportError: import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) DEFAULT_DB_PATH = "database/tg-bot-database.db" async def column_exists(conn: aiosqlite.Connection, table: str, column: str) -> bool: """Проверяет существование колонки в таблице.""" cursor = await conn.execute(f"PRAGMA table_info({table})") columns = await cursor.fetchall() return any(col[1] == column for col in columns) async def main(db_path: str) -> None: """ Основная функция миграции. Добавляет колонку ml_scores в таблицу post_from_telegram_suggest. Миграция идемпотентна - можно запускать повторно без ошибок. """ db_path = os.path.abspath(db_path) if not os.path.exists(db_path): logger.error(f"База данных не найдена: {db_path}") return async with aiosqlite.connect(db_path) as conn: await conn.execute("PRAGMA foreign_keys = ON") # Проверяем и добавляем колонку ml_scores if not await column_exists(conn, "post_from_telegram_suggest", "ml_scores"): await conn.execute( "ALTER TABLE post_from_telegram_suggest ADD COLUMN ml_scores TEXT" ) logger.info("Колонка ml_scores добавлена в post_from_telegram_suggest") else: logger.info("Колонка ml_scores уже существует") await conn.commit() logger.info("Миграция add_ml_scores_columns завершена успешно") if __name__ == "__main__": parser = argparse.ArgumentParser( description="Добавление колонки ml_scores для ML-скоринга" ) parser.add_argument( "--db", default=os.environ.get("DATABASE_PATH", DEFAULT_DB_PATH), help="Путь к БД", ) args = parser.parse_args() asyncio.run(main(args.db))