@Generous_Wolf
Учу python

Python+mysqlite+bot telegarm не могу добавить в базу данных. Как правильно сделать?

Здравствуйте. Не могу сделать так чтобы бот в телеграм записывал данные в базу данных. Точнее не могу точно понять как это сделать. Подскажите пожалуйста.
Вот шаблон бота (брал с интернета, он изначально не имеет подключение базы данных)
Я хотел бы чтобы для начала хоть введенное пользователем имя добавлялось в бд. Но не пойму куда вставлять: sql.execute(f"INSERT INTO bot (user_id) VALUES(?)", (text))
db.commit() . Щас она в функции next1. И в таком формате она не добавляет в бд запись пользователя. Я что-то походу не правильно команду пишу. Создавать базу создает, моей командой CREATE. А вот добавлять не хочет, выдает ошибку.
Если просто работать python+mysqlite, то введенные данные через input работают.
# coding=utf-8
import telebot
import sqlite3 as sql
from telebot import types



db = sql.connect('ser.db')
sql = db.cursor()
sql.execute(
    """CREATE TABLE IF NOT EXISTS bot(id INTEGER, user_id TEXT, text TEXT)""")
db.commit()

TOKEN = '1585358429:AAGgHqXR5X5zjkCzjFy46a_keTAiieTLreуE'

bot = telebot.TeleBot(TOKEN)


# Добавляем обработчик сообщений, который проверяет команды, в нашем случае это команда /start
@bot.message_handler(commands=['start'])
def startpg(message):
    # Создаем клавиатуру, с единственной кнопкой "Начать"
    startmenu = types.ReplyKeyboardMarkup(True, True)
    startmenu.row('Начать')
    # Отправляем сообщение и отправляем подключение клавиатуры
    bot.send_message(message.chat.id, 'Добро пожаловать!',
                     reply_markup=startmenu)

# Добавляем обработчик сообщений, который проверяет тип сообщения "Текст"
@bot.message_handler(content_types=['text'])
def osnov(message):
    # Проверяем какое сообщение нам пришло, на русском языке код выглядит так "Если текст который отправил пользователь РАВЕН СЛОВУ "Начать", то у нас будет выполняться это действие"
    if message.text == 'Начать':
        # Мы присваиваем переменной "send" метод "Отправка сообщения"
        send = bot.send_message(message.chat.id, 'Введите ваше имя:')
        # Здесь мы делаем следующий шаг, который изначально будет отправлять переменную "send", а потом переходит к следующей функции под названием "next1"
        bot.register_next_step_handler(send, next1)
    # Проверяем какое сообщение нам пришло, на русском языке код выглядит так "Если текст который отправил пользователь РАВЕН СЛОВУ "Бизнес", то у нас будет выполняться это действие"
    elif message.text == 'Бизнес':
        if biznes == 'biznes':
            # Создаем клавиатуру
            vibor1 = types.ReplyKeyboardMarkup(True, False)
            vibor1.row('Курс1')
            vibor1.row('Курс2')
            vibor1.row('Курс3')
            vibor1.row('Курс4')
            vibor1.row('Назад')
            # Отправляем сообщение и отправляем подключение клавиатуры
            bot.send_message(message.chat.id, 'Выберите курс:',
                             reply_markup=vibor1)
    # Проверяем какое сообщение нам пришло, на русском языке код выглядит так "Если текст который отправил пользователь РАВЕН СЛОВУ "Программирование", то у нас будет выполняться это действие"
    elif message.text == 'Программирование':
        if biznes == 'biznes':
            # Создаем клавиатуру
            vibor2 = types.ReplyKeyboardMarkup(True, False)
            vibor2.row('C#')
            vibor2.row('Python')
            vibor2.row('C++')
            vibor2.row('Delphi')
            vibor2.row('Назад')
            # Отправляем сообщение и отправляем подключение клавиатуры
            bot.send_message(
                message.chat.id, 'Выберите язык программирования:', reply_markup=vibor2)
    # Проверяем какое сообщение нам пришло, на русском языке код выглядит так "Если текст который отправил пользователь РАВЕН СЛОВУ "Лайфаки", то у нас будет выполняться это действие"
    elif message.text == 'Лайфаки':
        if biznes == 'biznes':
            # Создаем клавиатуру
            vibor3 = types.ReplyKeyboardMarkup(True, False)
            vibor3.row('Лайфак1')
            vibor3.row('Лайфак2')
            vibor3.row('Лайфак3')
            vibor3.row('Лайфак4')
            vibor3.row('Назад')
            # Отправляем сообщение и отправляем подключение клавиатуры
            bot.send_message(
                message.chat.id, 'Выберите лайфак:', reply_markup=vibor3)
    # Проверяем какое сообщение нам пришло, на русском языке код выглядит так "Если текст который отправил пользователь РАВЕН СЛОВУ "Фитнес", то у нас будет выполняться это действие"
    elif message.text == 'Фитнес':
        if biznes == 'biznes':
            # Создаем клавиатуру
            vibor4 = types.ReplyKeyboardMarkup(True, False)
            vibor4.row('Питание')
            vibor4.row('Упражнения')
            vibor4.row('Пресс')
            vibor4.row('Фитнес клубы')
            vibor4.row('Назад')
            # Отправляем сообщение и отправляем подключение клавиатуры
            bot.send_message(message.chat.id, 'Выберите:', reply_markup=vibor4)
    # Проверяем какое сообщение нам пришло, на русском языке код выглядит так "Если текст который отправил пользователь РАВЕН СЛОВУ "Назад", то у нас будет выполняться это действие"
    elif message.text == 'Назад':
        # Так делается, для того, чтобы перейти к фукнции с назаваением "next2"
        next2(message)

# Создаем функцию, для того, чтобы ответить на первое сообщение "Введите ваше имя:"


def next1(message):
    # Мы присваиваем переменной "send" метод "Отправка сообщения"
    send = bot.send_message(
        message.chat.id, 'Очень приятно {name}, введите ваш возвраст:'.format(name=message.text))
    #sql.execute(f"INSERT INTO bot (user_id, text) VALUES ({format})")
    sql.execute(f"INSERT INTO bot (user_id) VALUES(?)", (text))
    db.commit()
    # Здесь мы делаем следующий шаг, который изначально будет отправлять переменную "send", а потом переходит к следующей функции под названием "next2"
    bot.register_next_step_handler(send, next2)

# Создаем функцию, для того, чтобы ответить на сообщение "Очень приятно {name},Введите ваш возвраст:"


def next2(message):
    global biznes
    biznes = 'biznes'
    # Создаем клавиатуру
    vibor = types.ReplyKeyboardMarkup(True, False)
    vibor.row('Бизнес')
    vibor.row('Программирование')
    vibor.row('Лайфаки')
    vibor.row('Фитнес')
    # Отправляем сообщение и отправляем подключение клавиатуры
    bot.send_message(
        message.chat.id, 'Хорошо, выберите тематику курсов?', reply_markup=vibor)


bot.polling()
  • Вопрос задан
  • 879 просмотров
Решения вопроса 1
@Alexa2007
#Создай отдельный файл с классом типа этого
# импортируй from my_baza_class import base as b
#В своём коде вставляй где хочешь
#Пример внизу
#
import sqlite3


class base:
    def __init__(self,table):
        self.table = table
        self.conn = sqlite3.connect("mydatabase.db")
        self.cursor = self.conn.cursor()
        print("Open DB")


    def __del__(self):
        print("CloseDB")


    def insert(self, full_name,last_name):
        sql = f"INSERT INTO {self.table} VALUES (null,'{full_name}', '{last_name}') "
        self.cursor.execute(sql)
        self.conn.commit()
        print('INSERT DONE')


    def select(self):
        res=[]
        sql = f"SELECT * FROM {self.table}"
        for _ in self.cursor.execute(sql):
            res.append(str(_[0]) +' '+ str(_[1])+' '+str(_[2]))
        print('SELECT DONE')
        return res

    def create_table(self):
        try:
            self.cursor.execute(f"""CREATE TABLE IF NOT EXISTS {self.table}
                      (id integer primary key AUTOINCREMENT, full_name text, last_name text)
                   """)
            self.conn.commit()
            print('CREATE TABLE DONE')
        except Exception as e:
            print('ERROR')





#b = base('users')
#b.create_table()
#for x in range(1,4):
#    b.insert(f'full_name{x}',f'last_name{x}')

#x = b.select()
#print(x)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы