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

7.3 KiB
Raw Permalink Blame History

🗑️ Скрипт очистки базы данных

Описание

clear_database.py - скрипт для полной очистки всех данных из базы данных бота.

⚠️ ВНИМАНИЕ!

Этот скрипт удаляет ВСЕ данные без возможности восстановления:

  • Всех пользователей
  • Все розыгрыши (активные и завершенные)
  • Все счета участников
  • Все записи об участии
  • Всех победителей
  • Все записи верификации

Использование

Через Makefile (рекомендуется)

make clear-db

Система попросит подтверждение:

⚠️  ВНИМАНИЕ! Это удалит ВСЕ данные из базы данных!
   - Все пользователи
   - Все розыгрыши
   - Все счета
   - Все участия
   - Всех победителей

Вы уверены? Введите 'yes' для подтверждения:

Напрямую через Python

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:

DATABASE_URL=postgresql+asyncpg://user:password@host:port/database

Проверка перед запуском:

# Проверьте что вы на правильной базе
grep DATABASE_URL .env

Создание бэкапа (ОБЯЗАТЕЛЬНО для production):

# 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

Альтернативы

Мягкая очистка (сохранение структуры):

-- Очистить только данные розыгрышей
DELETE FROM winners;
DELETE FROM participations;
DELETE FROM lotteries;

Выборочная очистка:

-- Удалить только тестовые данные
DELETE FROM users WHERE club_card_number LIKE 'TEST%';

Требования

  • Python 3.12+
  • Установленные зависимости (pip install -r requirements.txt)
  • Файл .env с корректным DATABASE_URL
  • Права на изменение данных в БД

Технические детали

Используемые библиотеки:

from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine

Асинхронное выполнение:

async with engine.begin() as conn:
    await conn.execute(text('DELETE FROM table_name'))

Обработка транзакций:

  • engine.begin() - автоматический COMMIT при успехе
  • engine.dispose() - закрытие всех соединений

Отладка

Проблемы с подключением:

# Проверка доступности БД
psql -h 192.168.0.102 -U bot_user -d bot_db -c "SELECT 1"

Проверка прав:

-- В psql
SELECT has_database_privilege('bot_user', 'bot_db', 'CONNECT');
SELECT has_table_privilege('bot_user', 'users', 'DELETE');

Логи:

Скрипт использует стандартный logging с уровнем INFO. Для отладки:

logging.basicConfig(level=logging.DEBUG)

См. также

  • docs/ADMIN_GUIDE.md - Руководство администратора
  • scripts/setup_postgres.sh - Настройка PostgreSQL
  • migrations/ - Миграции базы данных
  • Makefile - Все доступные команды