Задать вопрос
@asko6

Телеграм бот перестает работать, пишет ошибка в базе данных. Где ошибка?

Впервые сталкиваюсь с ботами на питоне. Сам бот получился, но вот с базой данной беда. Два раза нажимал /start и всё работало, но нажав в третий пишет ошибку :

cur.execute(" INSERT INTO users VALUES (?, ?);", users_id)
sqlite3.IntegrityError: UNIQUE constraint failed: users.id

ВОТ САМ КОД:

import telebot
import sqlite3
from telebot import types

bot = telebot.TeleBot('мой токен')

@bot.message_handler(commands=['start'])
def start(message):
conn = sqlite3.connect('info.db')
cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER, date text)""")
conn.commit()
users_id = [message.chat.id, 'date']
cur.execute(" INSERT INTO users VALUES (?, ?);", users_id)
conn.commit()
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1 = types.KeyboardButton("Предложить пост")
btn2 = types.KeyboardButton("Обратиться в тех.поддержку")
markup.add(btn1, btn2)
bot.send_message(message.chat.id, text="Привет, {0.first_name}! Я бот поддержки сайта Info.Energy. Здесь ты можешь предложить свой пост для сайта или написать о проблеме с сайтом.".format(message.from_user), reply_markup=markup)

@bot.message_handler(content_types=['text'])
def func(message):
if(message.text == "Предложить пост"):
bot.send_message(message.chat.id, text="Напиши мне название энергетика, твою оценку и описание энергетика.")
bot.register_next_step_handler(message, process_energy)
elif(message.text == "Обратиться в тех.поддержку"):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1 = types.KeyboardButton("Не работает сайт")
btn2 = types.KeyboardButton("Другое")
back = types.KeyboardButton("Вернуться в главное меню")
markup.add(btn1, btn2, back)
bot.send_message(message.chat.id, text="Что случилось?", reply_markup=markup)

elif(message.text == "Не работает сайт"):
bot.send_message(message.chat.id, "Программист посмотрит что не так и решит этот вопрос.")

elif message.text == "Другое":
bot.send_message(message.chat.id, text="Опишите проблему, желательно подробно.")
bot.register_next_step_handler(message, process_support)

elif (message.text == "Вернуться в главное меню"):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
button1 = types.KeyboardButton("Предложить пост")
button2 = types.KeyboardButton("Обратиться в тех.поддержку")
markup.add(button1, button2)
bot.send_message(message.chat.id, text="Вы вернулись в главное меню", reply_markup=markup)
else:
bot.send_message(message.chat.id, text="На такую команду я не запрограммирован..")

def process_energy(message):
bot.send_message(message.chat.id,'Отлично! Я отправил твой пост на модерацию.')

def process_support(message):
bot.send_message(message.chat.id, 'В ближайшее время вам ответит наш менеджер и решит ваш вопрос.')

bot.polling(none_stop=True)

БУДУ ОЧЕНЬ ПРИЗНАТЕЛЕН ЗА ПОМОЩЬ
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Включи голову и подумай.
Судя по ошибке, у тебя в таблице users ID пользователя - уникальный ключ.
Запрос на создание таблицы у тебя не содержит указания ключа, что, к слову, нехорошо. Я полагаю, ты убрал запись о ключе в какой-то момент, но не пересоздал таблицу.
Ты записываешь в эту таблицу данные о пользователе всякий раз, когда получаешь команду /start.
Внимание, вопрос: что произойдёт, если пользователь введёт /start ещё раз?
Прааааавильно, бот попытается создать ещё одну запись для этого пользователя. Что запрещено наличием первичного ключа.

Для начала ответь себе на вопрос: что тебе нужно сделать в базе, если пользователь ввёл /start ещё раз?
Ничего? Читай про форму INSERT OR IGNORE, она как раз позволяет молча пропустить запись, если такой первичный ключ уже есть.
Сообщить пользователю? Тогда сначала проверь в базе наличие записи для этого пользователя, и если она есть - сообщай, если её нет, то вноси в базу.
Ответ написан
Комментировать
fleshandmolodoy
@fleshandmolodoy
для записи нужна такая конструкция:
users_id = (message.chat.id, 'date')
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы