Помогите исправить ошибку c sqlite3

elif call.data == 'my':
      user_id = call.message.chat.id
      cur.execute('UPDATE users SET balance = balance + 300 WHERE id = ?', (user_id,))
      user = cur.fetchone()
      if user is None:
           cur.execute('INSERT INTO users(id, name, balance) VALUES (?,?,?)', (user_id, call.message.chat.first_name, 0))
           conn.commit()
           bot.send_message(user_id, 'Привет, твой баланс - 0')
      else:
           bot.send_message(user_id, f'Ваш баланс: {user[2]}')
           conn.close()

Возникает ошибка:

sqlite3.IntegrityError: UNIQUE constraint failed: users.id

Как её исправить? в таблице нет пользователей с одинаковым айди


Ответы (3 шт):

Автор решения: Fox Fox

Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.id возникает, когда вы пытаетесь вставить запись в таблицу, где поле id должно быть уникальным, но значение id, которое вы пытаетесь вставить, уже существует в таблице.

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

→ Ссылка
Автор решения: mrBars1k

Судя по всему, Вы хотели сделать ввод новых данных только в том случае, если в таблице ещё нет такой записи и проверку реализовали через попытку обновления данных.

Но Ваш код некорректен:

cur.execute('UPDATE users SET balance = balance + 300 WHERE id = ?', (user_id,))
user = cur.fetchone() #  Всегда будет None 

Вы пытаетесь обновить данные с помощью UPDATE, а затем получить данные через fetchone, но оно ничего не вернёт, даже при успехе.

Для проверки наличия данных в таблице используется SELECT и затем уже fetch.

Проблема: Ваша ошибка срабатывает потому, что в таблице уже есть значение, которое пытаетесь добавить в таблицу, потому что проверка всегда возвращает None.

К тому же, у Вас проблемы с логикой работы программы. Она закрывает подключение к БД только в случае срабатывания else, а в остальных оставляет открытым. Также commit происходит только в блоке if

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

Было бы замечательно, если бы приложили схему таблицы.

→ Ссылка
Автор решения: kretoffer

Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.id возникает, когда вы пытаетесь вставить запись в таблицу, где поле id должно быть уникальным, но значение id, которое вы пытаетесь вставить, уже существует в таблице.

Чтобы избежать этого нужно при создании таблицы добавить autoincrement key:

cur.execute("CREATE TABLE IF NOT EXISTS users (auto_key int auto_increment primary key, <Остальные ваши столбцы>")
→ Ссылка