Как создать базу данных при команде /start в Telegram боте

    При разработке Telegram-бота на Python часто возникает необходимость сразу после команды /start сохранить данные пользователя: его ID, имя, количество монет (по умолчанию 1) и количество рефералов (по умолчанию 0). Ввод от пользователя не требуется - всё должно происходить автоматически. В этой статье мы разберём готовое решение с использованием SQLite и библиотеки python-telegram-bot.

    Подготовка окружения и подключение библиотек

    Для работы вам понадобятся библиотеки python-telegram-bot и встроенная sqlite3. Установите их через pip:

    pip install python-telegram-bot

    Импортируем необходимые модули и создаём подключение к базе данных:

    import sqlite3
    from telegram import Update
    from telegram.ext import Application, CommandHandler, ContextTypes
    
    # Подключение к БД (файл users.db)
    conn = sqlite3.connect('users.db', check_same_thread=False)
    cursor = conn.cursor()

    Создание таблицы пользователей

    Перед первым использованием нужно создать таблицу, если её ещё нет. Выполните этот код один раз (например, при запуске бота):

    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            user_id INTEGER PRIMARY KEY,
            first_name TEXT,
            coins INTEGER DEFAULT 1,
            referrals INTEGER DEFAULT 0
        )
    ''')
    conn.commit()

    Здесь user_id - уникальный идентификатор пользователя из Telegram, first_name - его имя, coins и referrals - числовые поля со значениями по умолчанию 1 и 0 соответственно.

    Обработчик команды /start с добавлением в БД

    Теперь напишем функцию, которая будет вызываться при команде /start. Она проверяет, есть ли пользователь в базе, и если нет - добавляет его:

    async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
        user = update.effective_user
        user_id = user.id
        first_name = user.first_name or "Пользователь"
    
        # Проверяем, существует ли уже запись
        cursor.execute('SELECT user_id FROM users WHERE user_id = ?', (user_id,))
        if cursor.fetchone() is None:
            # Добавляем нового пользователя со значениями по умолчанию
            cursor.execute('''
                INSERT INTO users (user_id, first_name, coins, referrals)
                VALUES (?, ?, 1, 0)
            ''', (user_id, first_name))
            conn.commit()
            await update.message.reply_text(f"Привет, {first_name}! Твой профиль создан.")
        else:
            await update.message.reply_text(f"С возвращением, {first_name}!")

    Обратите внимание: мы используем update.effective_user, чтобы получить ID и имя пользователя даже в группах или каналах. После успешной вставки бот отправляет приветственное сообщение.

    Запуск бота и регистрация хендлера

    Осталось создать экземпляр приложения и добавить обработчик команды:

    def main():
        app = Application.builder().token("ВАШ_ТОКЕН_БОТА").build()
        app.add_handler(CommandHandler("start", start))
        app.run_polling()
    
    if __name__ == '__main__':
        main()

    Замените ВАШ_ТОКЕН_БОТА на реальный токен, полученный от BotFather. После запуска бот будет автоматически сохранять каждого нового пользователя в таблицу users.

    Проверка работы и возможные ошибки

    Чтобы убедиться, что данные записываются корректно, можно добавить команду для просмотра статистики:

    async def stats(update: Update, context: ContextTypes.DEFAULT_TYPE):
        cursor.execute('SELECT COUNT(*), SUM(coins), SUM(referrals) FROM users')
        count, total_coins, total_refs = cursor.fetchone()
        await update.message.reply_text(
            f"Всего пользователей: {count}\n"
            f"Общее количество монет: {total_coins}\n"
            f"Общее количество рефералов: {total_refs}"
        )

    Не забудьте добавить в main() обработчик CommandHandler("stats", stats). Если возникают ошибки, проверьте права на запись в директорию с ботом и корректность токена.

    Заключение

    Мы рассмотрели простой и надёжный способ автоматического создания записи в базе данных при команде /start. Используя SQLite и python-telegram-bot, вы можете легко расширить функционал: добавить поле для баланса, логирование действий или интеграцию с реферальной системой. Главное - не забывайте про обработку ошибок и закрытие соединения с БД при завершении работы бота.

    Часто задаваемые вопросы