"""Репозиторий для работы с миграциями базы данных.""" import aiosqlite from database.base import DatabaseConnection class MigrationRepository(DatabaseConnection): """Репозиторий для управления миграциями базы данных.""" async def create_table(self): """Создает таблицу migrations, если она не существует.""" query = """ CREATE TABLE IF NOT EXISTS migrations ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, script_name TEXT NOT NULL UNIQUE, applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) ) """ await self._execute_query(query) self.logger.info("Таблица migrations создана или уже существует") async def get_applied_migrations(self) -> list[str]: """Возвращает список имен примененных скриптов миграций.""" conn = None try: conn = await self._get_connection() cursor = await conn.execute("SELECT script_name FROM migrations ORDER BY applied_at") rows = await cursor.fetchall() await cursor.close() return [row[0] for row in rows] except Exception as e: self.logger.error(f"Ошибка при получении списка миграций: {e}") raise finally: if conn: await conn.close() async def is_migration_applied(self, script_name: str) -> bool: """Проверяет, применена ли миграция.""" conn = None try: conn = await self._get_connection() cursor = await conn.execute( "SELECT COUNT(*) FROM migrations WHERE script_name = ?", (script_name,) ) row = await cursor.fetchone() await cursor.close() return row[0] > 0 if row else False except Exception as e: self.logger.error(f"Ошибка при проверке миграции {script_name}: {e}") raise finally: if conn: await conn.close() async def mark_migration_applied(self, script_name: str) -> None: """Отмечает миграцию как примененную.""" conn = None try: conn = await self._get_connection() await conn.execute( "INSERT INTO migrations (script_name) VALUES (?)", (script_name,) ) await conn.commit() self.logger.info(f"Миграция {script_name} отмечена как примененная") except aiosqlite.IntegrityError: self.logger.warning(f"Миграция {script_name} уже была применена ранее") except Exception as e: self.logger.error(f"Ошибка при отметке миграции {script_name}: {e}") raise finally: if conn: await conn.close() async def create_table_from_sql(self, sql_script: str) -> None: """Создает таблицу из SQL скрипта. Используется в миграциях.""" await self._execute_query(sql_script)