database is locked проблема питон sqlite
Делаю бота в тг, хочу чтобы он просто записывал в базу данных id пользователя и username(пока что), но у меня никак не получается обойти эту ошибку
Запуск бота...
2024-07-20 13:43:38,781 (__init__.py:1095 MainThread) ERROR - TeleBot: "Infinity polling exception: database is locked"
2024-07-20 13:43:38,786 (__init__.py:1097 MainThread) ERROR - TeleBot: "Exception traceback:
Traceback (most recent call last):
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/telebot/__init__.py", line 1090, in infinity_polling
self.polling(non_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/telebot/__init__.py", line 1178, in polling
self.__threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout,
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/telebot/__init__.py", line 1253, in __threaded_polling
raise e
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/telebot/__init__.py", line 1215, in __threaded_polling
self.worker_pool.raise_exceptions()
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/telebot/util.py", line 150, in raise_exceptions
raise self.exception_info
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/telebot/util.py", line 93, in run
task(*args, **kwargs)
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/telebot/__init__.py", line 8707, in _run_middlewares_and_handler
result = handler['function'](message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 33, in start
File "/storage/emulated/0/db.py", line 38, in add_username
return self.cursor.execute("UPDATE users SET username = ? WHERE user_id = ?", (username, user_id,)) #message.from_user.username
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: database is locked
Помогите пожалуйста, (я не профи и ошибка может быть тупая немного), я уже все перепробовала, вот код
import openai
import telebot
import telegram
import os
from ai_bot import chat_completion
from telebot import types
from datetime import datetime
from db import Database
date = datetime.today()
Weekday = date.weekday()
db = Database("DataTg.db")
def main():
try:
print("Запуск бота...")
bot = telebot.TeleBot(
token = '',
)
@bot.message_handler(commands=['start'])
def start(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
item1 = types.KeyboardButton('Отметить настроение')
item2 = types.KeyboardButton('Старт')
item3 = types.KeyboardButton('Помощь')
markup.add(item1, item2, item3)
text1 = f'Привет, {message.from_user.first_name}! Здесь ты можешь отслеживать свое настроение и получить помощь от чат ГПТ!'
bot.send_message(message.chat.id, text1 .format(message.from_user), reply_markup = markup)
if (not db.user_exists(message.from_user.id)):
db.add_user(message.from_user.id)
db.add_username(message.from_user.username, message.from_user.id)
@bot.message_handler(content_types=['text'])
def callback_handler(message):
if message.text == 'Отметить настроение':
markup = types.InlineKeyboardMarkup()
item1 = types.InlineKeyboardButton(text = 'Счастливое', callback_data = 'happy')
item2 = types.InlineKeyboardButton(text = 'Грустное', callback_data = 'sadness')
item3 = types.InlineKeyboardButton(text = 'Злое', callback_data = 'furios')
item4 = types.InlineKeyboardButton(text = 'Подавленное', callback_data = 'depressed')
item5 = types.InlineKeyboardButton(text = 'Уставшее', callback_data = 'tired')
item6 = types.InlineKeyboardButton(text = 'Тревожное', callback_data = 'anxiety')
item7 = types.InlineKeyboardButton(text = 'Воодушевлённое', callback_data = 'motivated')
item8 = types.InlineKeyboardButton(text = 'Спокойное', callback_data = 'calm')
item9 = types.InlineKeyboardButton(text = 'Беззаботное', callback_data = 'carefree')
markup.add(item1, item2, item3, item4, item5, item6, item7, item8, item9)
global todayW
match Weekday:
case 0:
todayW = 'понедельник'
case 1:
todayW = 'вторник'
case 2:
todayW = 'среду'
case 3:
todayW = 'четверг'
case 4:
todayW = 'пятницу'
case 5:
todayW = 'субботу'
case 6:
todayW = 'восквесенье'
global msg
msg = bot.send_message(message.chat.id, f'Сегодня вы можете отметить свое <d>настроение</d> на {todayW}!\nВыберите его ниже: ' .format(message.from_user), reply_markup = markup)
print(3)
@bot.callback_query_handler(func = lambda message: True)
def callback_handler(call):
if call.data == 'happy':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'sadness':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'furios':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'depressed':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'tired':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'anxiety':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'motivated':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'calm':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if call.data == 'carefree':
bot.edit_message_text(chat_id=message.chat.id, message_id=msg.message_id, text="Сохранено" .format(message.from_user))
if message.text == 'Старт':
start(message)
print(2)
if message.text == 'Помощь':
markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
item1 = types.KeyboardButton('Отметить настроение')
item2 = types.KeyboardButton('Старт')
item3 = types.KeyboardButton('Помощь')
markup.add(item1, item2, item3)
bot.send_message(message.chat.id, 'Если вы обнаружили некоторые неисправности, пожалуйста, напишите мне сюда https://t.me/anonaskbot?start=5nagq ' .format(message.from_user), reply_markup = markup)
print(1)
"""
if errors:
request = f"{request}\\n\\n" + ", ".join(errors)
bot.delete_message(
chat_id = message.from_user.id,
message_id = writing.message_id,
)
bot.reply_to(message, request)"""
bot.infinity_polling(none_stop = True)
except Exception as e:
print(f"Произошла ошибка: {e}")
if __name__ == '__main__':
main()
Вот код базы:
import sqlite3
class Database:
def __init__(self, db_file):
self.con = sqlite3.connect(db_file)
self.cursor = self.con.cursor()
self.cursor.close()
self.con.close()
def add_user(self, user_id):
self.con = sqlite3.connect("DataTg.db", check_same_thread=False)
self.cursor = self.con.cursor()
return self.cursor.execute("INSERT INTO users (user_id) VALUES (?)", (user_id,))
self.con.commit()
self.cursor.close()
self.con.close()
def user_exists(self, user_id):
self.con = sqlite3.connect("DataTg.db", check_same_thread=False)
self.cursor = self.con.cursor()
result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)).fetchall()
return bool(len(result))
self.con.commit()
self.cursor.close()
self.con.close()
def add_username(self, username, user_id):
self.con = sqlite3.connect("DataTg.db", check_same_thread=False)
self.cursor = self.con.cursor()
return self.cursor.execute("UPDATE users SET username = ? WHERE user_id = ?", (username, user_id,))
self.con.commit()
self.cursor.close()
self.con.close()
Я в каждом запросе просто все закрываю и в каждом открываю, все бесполезно( буду рада, если найдется решение