#!/usr/bin/env python3 """ Миграция: Создание таблицы bot_settings для хранения настроек бота. Создает таблицу с ключ-значение для хранения: - auto_publish_enabled: Включена ли авто-публикация (default: false) - auto_decline_enabled: Включено ли авто-отклонение (default: false) - auto_publish_threshold: Порог для авто-публикации (default: 0.8) - auto_decline_threshold: Порог для авто-отклонения (default: 0.4) """ 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 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" DEFAULT_SETTINGS = [ ("auto_publish_enabled", "false"), ("auto_decline_enabled", "false"), ("auto_publish_threshold", "0.8"), ("auto_decline_threshold", "0.4"), ] async def table_exists(conn: aiosqlite.Connection, table_name: str) -> bool: """Проверяет существование таблицы.""" cursor = await conn.execute( "SELECT name FROM sqlite_master WHERE type='table' AND name=?", (table_name,), ) result = await cursor.fetchone() return result is not None async def main(db_path: str) -> None: """ Основная функция миграции. Создает таблицу bot_settings и добавляет дефолтные настройки. Миграция идемпотентна - можно запускать повторно без ошибок. """ 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") if not await table_exists(conn, "bot_settings"): await conn.execute(""" CREATE TABLE bot_settings ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL UNIQUE, value TEXT NOT NULL, updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) ) """) logger.info("Таблица bot_settings создана") for key, value in DEFAULT_SETTINGS: await conn.execute( "INSERT INTO bot_settings (key, value) VALUES (?, ?)", (key, value), ) logger.info(f"Добавлена настройка: {key} = {value}") else: logger.info("Таблица bot_settings уже существует") for key, value in DEFAULT_SETTINGS: cursor = await conn.execute( "SELECT COUNT(*) FROM bot_settings WHERE key = ?", (key,) ) row = await cursor.fetchone() if row[0] == 0: await conn.execute( "INSERT INTO bot_settings (key, value) VALUES (?, ?)", (key, value), ) logger.info(f"Добавлена отсутствующая настройка: {key} = {value}") await conn.commit() logger.info("Миграция create_bot_settings_table завершена успешно") if __name__ == "__main__": parser = argparse.ArgumentParser( description="Создание таблицы bot_settings для настроек авто-модерации" ) parser.add_argument( "--db", default=os.environ.get("DATABASE_PATH", DEFAULT_DB_PATH), help="Путь к БД", ) args = parser.parse_args() asyncio.run(main(args.db))