Files
new_lottery_bot/scripts/README_CLEAR_DB.md
Andrew K. Choi 505d26f0e9
Some checks reported errors
continuous-integration/drone/push Build encountered an error
feat: Система автоматического подтверждения выигрышей с поддержкой множественных счетов
Основные изменения:

 Новые функции:
- Система регистрации пользователей с множественными счетами
- Автоматическое подтверждение выигрышей через inline-кнопки
- Механизм переигровки для неподтвержденных выигрышей (24 часа)
- Подтверждение на уровне счетов (каждый счет подтверждается отдельно)
- Скрипт полной очистки базы данных

🔧 Технические улучшения:
- Исправлена ошибка MissingGreenlet при lazy loading (добавлен joinedload/selectinload)
- Добавлено поле claimed_at для отслеживания времени подтверждения
- Пакетное добавление счетов с выбором розыгрыша
- Проверка владения конкретным счетом при подтверждении

📚 Документация:
- docs/AUTO_CONFIRM_SYSTEM.md - Полная документация системы подтверждения
- docs/ACCOUNT_BASED_CONFIRMATION.md - Подтверждение на уровне счетов
- docs/REGISTRATION_SYSTEM.md - Система регистрации
- docs/ADMIN_COMMANDS.md - Команды администратора
- docs/CLEAR_DATABASE.md - Очистка БД
- docs/QUICK_GUIDE.md - Быстрое начало
- docs/UPDATE_LOG.md - Журнал обновлений

🗄️ База данных:
- Миграция 003: Таблицы accounts, winner_verifications
- Миграция 004: Поле claimed_at в таблице winners
- Скрипт scripts/clear_database.py для полной очистки

🎮 Новые команды:
Админские:
- /check_unclaimed <lottery_id> - Проверка неподтвержденных выигрышей
- /redraw <lottery_id> - Повторный розыгрыш
- /add_accounts - Пакетное добавление счетов
- /list_accounts <telegram_id> - Список счетов пользователя

Пользовательские:
- /register - Регистрация с вводом данных
- /my_account - Просмотр своих счетов
- Callback confirm_win_{id} - Подтверждение выигрыша

🛠️ Makefile:
- make clear-db - Очистка всех данных из БД (с подтверждением)

🔒 Безопасность:
- Проверка владения счетом при подтверждении
- Защита от подтверждения чужих счетов
- Независимое подтверждение каждого выигрышного счета

📊 Логика работы:
1. Пользователь регистрируется и добавляет счета
2. Счета участвуют в розыгрыше
3. Победители получают уведомление с кнопкой подтверждения
4. Каждый счет подтверждается отдельно (24 часа на подтверждение)
5. Неподтвержденные выигрыши переигрываются через /redraw
2025-11-16 14:01:30 +09:00

228 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🗑️ Скрипт очистки базы данных
## Описание
`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` - Все доступные команды