Files
new_lottery_bot/scripts/clear_database.py
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

98 lines
3.5 KiB
Python
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.

#!/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())