Как сохранять значение в базу данных? telebot, sqlite3
У меня есть два файла, один с базой данных, другой основной. В основном файле есть две функции которые отвечают за изменение переменной attempts. Но если я буду использовать вот этот код для сохранения в базу данных attempts:
def set_attempts(self, attempts):
self.cursor.execute('''INSERT INTO users (attempts) VALUES (?)''', (attempts,))
return self.conn.commit()w
P.S
То ничего не обновляется в базе данных. До и после вызова функции записи базы данных я делал проверку с помощью print(get_init_storage(message.from_user.id)) которое выводит данные из БД. Вот код функции:
def get_init_storage(self, user_id):
result = self.conn.execute('''SELECT id,user_id,username, random_num,dev_mode_on, attempts, rand_one, rand_two FROM users WHERE user_id=?''', (user_id,)).fetchone()
return result
Также в файле с БД, в функции сохранения в бд attempts, ставил print(attempts), выводило значение которое я написал, но при выводе get_init_storage(message.from_user.id) Оставалось то же значение, а в программе SqliteStudio создавался новый профиль с user_id, user_name значением NULL, но с изменениями попыток какие я ставил:
Вот код сохранения переменной attempts в основном файле:
<@bot.message_handler(commands=['setattempts'])
def set_attempts(message):
bot.send_message(message.chat.id, 'Введите новое кол-во попыток:')
bot.register_next_step_handler(message, set_attempts_global)
def set_attempts_global(message):
user_guess = message.text
if not user_guess.isdigit():
msg = bot.reply_to(message, '❌Ошибка!❌\nВведите числo, а не буквы!')
bot.register_next_step_handler(msg, set_attempts_global)
return
if int(user_guess) != 0:
global attempts_default
attempts = int(user_guess)
attempts = BotDB.set_attempts(attempts) # не работает
BotDB.set_attempts(attempts) # не работает
attempts_default = attempts
bot.send_message(message.chat.id, f'✅Попытки успешно изменены✅\nНовое кол-во попыток: {attempts}')
print('------------------------------------')
print('attempts updated')
print(BotDB.get_data_storage(message.from_user.id))
print('------------------------------------')
else:
print('------------------------------------')
print('attempts loose update')
print(BotDB.get_data_storage(message.from_user.id))
print('------------------------------------')
msg = bot.reply_to(message, '❌Ошибка!❌\nНельзя поставить число 0!')
bot.register_next_step_handler(msg, set_attempts_global)
return>
Использую модули telebot, sqlite3. Версия python: python 3.12
Ответы (1 шт):
В зависимости от поставленной задачи, если стоит задача сохранять все изменения, для проведения анализа и обработки статистики, рекорды, динамика набора очков, то нужно добавить еще одно поле "дата время" и каждый раз сохранять все (измененные и не измененные) значения полей в базу данных. (+ статистика; - объем базы)
Если требуется только текущие значения можно через:
def update_storage(username, attempts):
# Здесь можно сделать через try except
# Функция для изменения значения по одному, если загрузка массовая не следует каждый раз откр и закр базу
con = sqlite3.connect('dbusers.db')
cur = con.cursor()
cur.execute(''' UPDATE users SET attempts=? WHERE username=? ''', (attempts, username ))
con.commit()
con.close()
return 0
изменять текущие значения. (- никакой истории)

