#!/usr/bin/env python3 """ Скрипт для полной очистки базы данных Удаляет все данные из всех таблиц и сбрасывает счетчики ID """ import asyncio import logging from sqlalchemy import text from sqlalchemy.ext.asyncio import create_async_engine logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def clear_database(): """Очистка всех таблиц и сброс последовательностей""" # Читаем DATABASE_URL из .env with open('.env', 'r') as f: for line in f: if line.startswith('DATABASE_URL='): DATABASE_URL = line.split('=', 1)[1].strip().strip('"').strip("'") break logger.info('🔌 Подключение к базе данных...') engine = create_async_engine(DATABASE_URL) try: async with engine.begin() as conn: # Отключаем ограничения внешних ключей await conn.execute(text('SET CONSTRAINTS ALL DEFERRED')) # Очищаем таблицы в правильном порядке (от зависимых к независимым) tables = [ 'winner_verifications', 'winners', 'participations', 'accounts', 'lotteries', 'users' ] logger.info('') logger.info('🗑️ Удаление данных из таблиц...') logger.info('-' * 60) for table in tables: result = await conn.execute(text(f'DELETE FROM {table}')) logger.info(f'✅ {table:25} - удалено {result.rowcount:5} строк') logger.info('-' * 60) # Сбрасываем последовательности (auto-increment) sequences = [ 'users_id_seq', 'lotteries_id_seq', 'accounts_id_seq', 'participations_id_seq', 'winners_id_seq', 'winner_verifications_id_seq' ] logger.info('') logger.info('🔄 Сброс последовательностей...') logger.info('-' * 60) for seq in sequences: try: await conn.execute(text(f'ALTER SEQUENCE {seq} RESTART WITH 1')) logger.info(f'✅ {seq}') except Exception as e: logger.warning(f'⚠️ {seq}: {e}') logger.info('-' * 60) logger.info('') logger.info('=' * 60) logger.info('🎉 ВСЕ ДАННЫЕ УСПЕШНО УДАЛЕНЫ ИЗ БАЗЫ ДАННЫХ!') logger.info('=' * 60) logger.info('') logger.info('Следующие ID начнутся с 1:') logger.info(' - users.id') logger.info(' - lotteries.id') logger.info(' - accounts.id') logger.info(' - participations.id') logger.info(' - winners.id') logger.info(' - winner_verifications.id') logger.info('') finally: await engine.dispose() logger.info('✅ Соединение с БД закрыто') if __name__ == '__main__': asyncio.run(clear_database())