# 🗑️ Скрипт очистки базы данных ## Описание `clear_database.py` - скрипт для полной очистки всех данных из базы данных бота. ## ⚠️ ВНИМАНИЕ! **Этот скрипт удаляет ВСЕ данные без возможности восстановления:** - Всех пользователей - Все розыгрыши (активные и завершенные) - Все счета участников - Все записи об участии - Всех победителей - Все записи верификации ## Использование ### Через Makefile (рекомендуется) ```bash make clear-db ``` Система попросит подтверждение: ``` ⚠️ ВНИМАНИЕ! Это удалит ВСЕ данные из базы данных! - Все пользователи - Все розыгрыши - Все счета - Все участия - Всех победителей Вы уверены? Введите 'yes' для подтверждения: ``` ### Напрямую через Python ```bash cd /home/trevor/new_lottery_bot source .venv/bin/activate python scripts/clear_database.py ``` ## Что делает скрипт 1. **Подключается к базе данных** используя `DATABASE_URL` из `.env` 2. **Удаляет данные в правильном порядке:** - `winner_verifications` - записи верификации победителей - `winners` - записи о победителях - `participations` - записи об участии в розыгрышах - `accounts` - счета участников - `lotteries` - розыгрыши - `users` - пользователи 3. **Сбрасывает счетчики ID (sequences):** - `users_id_seq` → 1 - `lotteries_id_seq` → 1 - `accounts_id_seq` → 1 - `participations_id_seq` → 1 - `winners_id_seq` → 1 - `winner_verifications_id_seq` → 1 4. **Фиксирует транзакцию** (COMMIT) 5. **Закрывает соединение** ## Вывод скрипта Пример успешного выполнения: ``` INFO:__main__:🔌 Подключение к базе данных... INFO:__main__:🗑️ Удаление данных из таблиц... INFO:__main__:------------------------------------------------------------ INFO:__main__:✅ winner_verifications - удалено 0 строк INFO:__main__:✅ winners - удалено 2 строк INFO:__main__:✅ participations - удалено 1 строк INFO:__main__:✅ accounts - удалено 2 строк INFO:__main__:✅ lotteries - удалено 1 строк INFO:__main__:✅ users - удалено 2 строк INFO:__main__:------------------------------------------------------------ INFO:__main__:🔄 Сброс последовательностей... INFO:__main__:------------------------------------------------------------ INFO:__main__:✅ users_id_seq INFO:__main__:✅ lotteries_id_seq INFO:__main__:✅ accounts_id_seq INFO:__main__:✅ participations_id_seq INFO:__main__:✅ winners_id_seq INFO:__main__:✅ winner_verifications_id_seq INFO:__main__:------------------------------------------------------------ INFO:__main__:============================================================ INFO:__main__:🎉 ВСЕ ДАННЫЕ УСПЕШНО УДАЛЕНЫ ИЗ БАЗЫ ДАННЫХ! INFO:__main__:============================================================ INFO:__main__:Следующие ID начнутся с 1: INFO:__main__: - users.id INFO:__main__: - lotteries.id INFO:__main__: - accounts.id INFO:__main__: - participations.id INFO:__main__: - winners.id INFO:__main__: - winner_verifications.id INFO:__main__:✅ Соединение с БД закрыто ``` ## Когда использовать ### ✅ Безопасные сценарии: - **Разработка/тестирование**: Очистка тестовых данных - **Staging окружение**: Подготовка к тестированию - **Миграция**: Перед полным переносом данных - **Сброс демо**: Возврат к чистому состоянию ### ❌ НЕ использовать: - **Production база**: НИКОГДА не запускайте на рабочей БД - **Активные розыгрыши**: Если есть незавершенные розыгрыши - **Без бэкапа**: Всегда делайте резервную копию перед очисткой ## Безопасность ### Файл читает DATABASE_URL из .env: ```env DATABASE_URL=postgresql+asyncpg://user:password@host:port/database ``` ### Проверка перед запуском: ```bash # Проверьте что вы на правильной базе grep DATABASE_URL .env ``` ### Создание бэкапа (ОБЯЗАТЕЛЬНО для production): ```bash # PostgreSQL pg_dump -h localhost -U bot_user -d bot_db > backup_$(date +%Y%m%d_%H%M%S).sql # Восстановление psql -h localhost -U bot_user -d bot_db < backup_20251116_140000.sql ``` ## Альтернативы ### Мягкая очистка (сохранение структуры): ```sql -- Очистить только данные розыгрышей DELETE FROM winners; DELETE FROM participations; DELETE FROM lotteries; ``` ### Выборочная очистка: ```sql -- Удалить только тестовые данные DELETE FROM users WHERE club_card_number LIKE 'TEST%'; ``` ## Требования - Python 3.12+ - Установленные зависимости (`pip install -r requirements.txt`) - Файл `.env` с корректным `DATABASE_URL` - Права на изменение данных в БД ## Технические детали ### Используемые библиотеки: ```python from sqlalchemy import text from sqlalchemy.ext.asyncio import create_async_engine ``` ### Асинхронное выполнение: ```python async with engine.begin() as conn: await conn.execute(text('DELETE FROM table_name')) ``` ### Обработка транзакций: - `engine.begin()` - автоматический COMMIT при успехе - `engine.dispose()` - закрытие всех соединений ## Отладка ### Проблемы с подключением: ```bash # Проверка доступности БД psql -h 192.168.0.102 -U bot_user -d bot_db -c "SELECT 1" ``` ### Проверка прав: ```sql -- В psql SELECT has_database_privilege('bot_user', 'bot_db', 'CONNECT'); SELECT has_table_privilege('bot_user', 'users', 'DELETE'); ``` ### Логи: Скрипт использует стандартный logging с уровнем INFO. Для отладки: ```python logging.basicConfig(level=logging.DEBUG) ``` ## См. также - `docs/ADMIN_GUIDE.md` - Руководство администратора - `scripts/setup_postgres.sh` - Настройка PostgreSQL - `migrations/` - Миграции базы данных - `Makefile` - Все доступные команды