Помогите исправить ошибку 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 шт):
Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.id
возникает, когда вы пытаетесь вставить запись в таблицу, где поле id должно быть уникальным, но значение id, которое вы пытаетесь вставить, уже существует в таблице.
Для того, чтоб проверить базу данных как следует, рекомендую воспользоваться программой SQLite Expert Pro.
Судя по всему, Вы хотели сделать ввод новых данных только в том случае, если в таблице ещё нет такой записи и проверку реализовали через попытку обновления данных.
Но Ваш код некорректен:
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 используется для автоинкремента и первичного ключа.
Было бы замечательно, если бы приложили схему таблицы.
Ошибка 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, <Остальные ваши столбцы>")