korol_mertv
@korol_mertv

Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id Как исправить?

Код
import sqlite3
import sys
import pathlib

class BotDB:
    def __init__(self, db_file):
        """Инициализация соединения с БД"""
        script_dir = pathlib.Path(sys.argv[0]).parent
        db_file_way = script_dir / db_file
        self.conn = sqlite3.connect(db_file_way)
        self.cursor = self.conn.cursor()

    def user_exists(self, user_id):
        """Проверяем, есть ли юзер в базе"""
        result = self.cursor.execute("SELECT `id` FROM `users` WHERE `user_id` = ?", (user_id,))
        return bool(len(result.fetchall()))

    def get_user_id(self, user_id):
        """Достаем id юзера в базе по его user_id"""
        result = self.cursor.execute("SELECT `id` FROM `users` WHERE `user_id` = ?", (user_id,))
        return result.fetchone()[0]

    def get_user_phone(self, user_id):
        result = self.cursor.execute("SELECT `user_phone_number` FROM `users` WHERE `user_id` = ?", (user_id,))
        return result.fetchone()[0]

    def add_user(self, user_id, user_phone_number):
        """Добавляем юзера и его номер телефона в базу"""
        self.cursor.execute("INSERT INTO `users` (`user_id`, `user_phone_number`) VALUES (?, ?)", (user_id, user_phone_number))
        return self.conn.commit()

    def get_points(self, user_id):
        # Получение количества баллов
        result = self.cursor.execute("SELECT `bonus_points` FROM `users` WHERE `user_id` = ?", (user_id,))
        return result.fetchone()[0]

    def close(self):
        # Закрытие соединения с БД
        self.conn.close()


После добавления пользователя в базу данных бот перестает отвечать и выдает ошибку
sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id

После перезапуска бота всё работает нормально, на требуемые команды отвечает
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ты добавляешь уже существующего пользователя.
Прочитай про запрос INSERT ... ON CONFLICT DO ... .
Тут есть два варианта:
INSERT ... ON CONFLICT DO UPDATE (он же UPSERT), чтобы обновить данные о пользователе.
INSERT ... ON CONFLICT DO NOTHING, чтобы молча проигнорировать уже существующего пользователя.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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