@codexim

Как добавить в базу данных SQLite3 id пользователя и введенное им сообщение?

Хочу, чтобы в бд sqlite добавлялся id пользователя и введенное им сообщение. Причем это сообщение должно перезаписываться при каждом запуске бота в телеграмме. Как это можно реализовать?
import sqlite3
import telebot

bot = telebot.TeleBot("token")

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


def db_table_val(us_id,text):
    cursor.execute('INSERT INTO test (us_id, text) VALUES (?, ?)',
                   (us_id,text))
    conn.commit()

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text.lower() == '/reg':
        bot.send_message(message.chat.id, 'success')

        us_id = message.from_user.id
        text = message.text

        db_table_val(us_id,text)

bot.infinity_polling()

если кратко: id должен сохраняться а сообщение каждый раз перезаписываться
этот код выдает ошибку, когда второй раз запускаешь /reg
2022-04-10 12:41:32,445 (__init__.py:615 MainThread) ERROR - TeleBot: "Infinity polling exception: UNIQUE constraint failed: test.us_id"
2022-04-10 12:41:32,446 (__init__.py:617 MainThread) ERROR - TeleBot: "Exception traceback:
Traceback (most recent call last):
  File "C:\Users\Maxim\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\__init__.py", line 611, in infinity_polling
    self.polling(none_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
  File "C:\Users\Maxim\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\__init__.py", line 658, in polling
    self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
  File "C:\Users\Maxim\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\__init__.py", line 720, in __threaded_polling
    raise e
  File "C:\Users\Maxim\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\__init__.py", line 680, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\Maxim\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\util.py", line 135, in raise_exceptions
    raise self.exception_info
  File "C:\Users\Maxim\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\util.py", line 87, in run
    task(*args, **kwargs)
  File "C:\Users\Maxim\PycharmProjects\pythonProject\амао.py", line 23, in get_text_messages
    db_table_val(us_id,text)
  File "C:\Users\Maxim\PycharmProjects\pythonProject\амао.py", line 11, in db_table_val
    cursor.execute('INSERT INTO test (us_id, text) VALUES (?, ?)',
sqlite3.IntegrityError: UNIQUE constraint failed: test.us_id

таблицу для бд создавал в самой программе sqlite studio вот как выглядит параметры для столбцов
62528c0a85a98217606455.png
  • Вопрос задан
  • 1262 просмотра
Решения вопроса 1
@szjyakgf
Потому что ваш бот записывает второй раз сообщение и id. Но столбец id вы сделали уникальным. Поэтому выдает ошибку. Вам нужно сделать проверку: eсли есть такой id в базе то записывать только сообщение, без id.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
Я бы вам советовал почитать, для начала, что-нибудь по проектированию баз данных и sql.
Просто такое ощущение, что вы тыкаете наугад, в надежде, что что-то да выйдет. При первом сообщении юзера, полагаю, все проходит нормально. А во второй раз выдает ошибку:
sqlite3.IntegrityError: UNIQUE constraint failed: test.us_id
.
Что значит (относительно вольный перевод).
sqlite3.IntegrityError: условие "УНИКАЛЬНОЕ значение" не соблюдено: test.us_id
.
Слово УНИКАЛЬНОЕ специально написано заглавными. К тому-же, у вас на скриншоте видно, что в графе уникальность стоит "галочка". Следовательно, с такой схемой таблицы, у одного юзера - одно сообщение.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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