@092exe

Бот на Telebot падает, когда отправляешь второй одинаковый запрос в БД sqllite. Как исправить?

Вопрос в заголовке. При повторном подключении пользователя и запросе меню, бот выдает ошибку

"sqlite3.IntegrityError: UNIQUE constraint failed: User.user_id"

я понимаю, что надо исключить каким то образом пользователя из списка на добавление, но не могу задать верный вопрос гуглу.

import telebot
import sqlite3
from telebot import types # для указание типов
token = 'xxx'

bot = telebot.TeleBot(token)

conn = sqlite3.connect('db/db.db', check_same_thread=False)
cursor = conn.cursor()

def db_table_val(user_id: int, user_name: str, user_surname: str, username: str):
	cursor.execute('INSERT INTO User (user_id, user_name, user_surname, username) VALUES (?, ?, ?, ?)', (user_id, user_name, user_surname, username))
	conn.commit()

@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton(" Посмотреть меню")
    btn2 = types.KeyboardButton("❓ Сделать заказ")
    btn3 = types.KeyboardButton("Как я работаю?")
    markup.add(btn1, btn2, btn3)
    bot.send_message(message.chat.id, text="Привет, {0.first_name}! Я тестовый бот для шаурмечной".format(message.from_user), reply_markup=markup)


@bot.message_handler(content_types=['text', 'photo'])
def func(message):
    if(message.text == " Посмотреть меню"):
        bot.send_photo(message.chat.id, open('photo.jpg', 'rb'))

        us_id = message.from_user.id
        us_name = message.from_user.first_name
        us_sname = message.from_user.last_name
        username = message.from_user.username

        db_table_val(user_id=us_id, user_name=us_name, user_surname=us_sname, username=username)
  • Вопрос задан
  • 101 просмотр
Решения вопроса 2
deepblack
@deepblack Куратор тега Python
func(message) -> db_table_val(...) -> cursor.execute(INSERT INTO User...)

При каждом нажатии " Посмотреть меню" в Telegram ты пытаешься добавить пользователя в БД,
сделай перед вставкой проверку, существует пользователь или нет.

Беглое гугление: python sqlite check if row exists
Первый попавшийся ответ:
https://stackoverflow.com/a/2440179/2981702

Дальше думаю сообразишь )
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Если ты хочешь при любом действии пользователя убедиться, что он в базе, то тебе нужен не просто INSERT, а INSERT ON CONFLICT IGNORE или INSERT ON CONFLICT UPDATE. Если тебе требуется что-то обновлять (например, хранить для пользователя момент последнего обращения к боту), то нужен второй. Если не требуется, то лучше первый.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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