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

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

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

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