@animanshnik

Как пофиксить ошибку database is locked?

import os
import sqlite3
import sys
import random
import time
from PyQt5 import QtWidgets
import shop_design  # Файл дизайна
import minutes_main_menu  # Основной файл программы
import Weapon_handler  # JSON с хар-ками оружия
import sqlite_logic  # sqlite подключения, не относятся к этому файлу.


# IMPORTS#

class logic_shop(QtWidgets.QMainWindow, shop_design.Ui_MainWindow, QtWidgets.QLineEdit, QtWidgets.QListWidget):
    def __init__(self):
        try:
            ####
            super(logic_shop, self).__init__()
            self.setupUi(self)
            print(1)
            self.Exit_but.clicked.connect(lambda: self.exit_main())
            ## Подключение к pyqt ##
            self.sqlite_close_weapon() # Закрытия на случай занятости БД (не помогает)
            conn, cur, row = self.sqlite_connect_weapon() # Открытие нового подключения к БД
            if row is None:
                self.update_sqlite() # Обновление базы
                time_update = 300
            else:
                if int(time.time()) - int(row[14]) >= 10: #Если с момента 1 подключения прошло больше 10 секунд
                    # Когда выполняется это условие - база становится закрытой.
                    self.update_sqlite()
                    print(1)
                    time_update = 300 - (int(time.time()) - int(row[14]))
                else:
                    time_update = 300 - (int(time.time()) - int(row[14]))
                    self.sqlite_close_weapon() # Закрытие подключения
            self.render_shop(time_update) # Подставление значений
            print(1)
            self.sqlite_close_weapon() # Закрытие подключения
        except Exception as ex:
            print(ex)

    def render_shop(self, time_update):
        conn, cur, row = self.sqlite_connect_weapon()
        ####
        self.label_2.setText(row[1])
        self.label_9.setText(row[4])
        self.label_10.setText(row[7])
        self.label_11.setText(row[10])
        for i in Weapon_handler.data['weapon']['swords']:
            if i['name'] == row[10]:
                self.label_12.setText(f"{i['damage']} ATK")
                self.label_16.setText(f"{i['speed']} SPD")
                self.label_20.setText(row[11])
                self.label_24.setText(i['element'])
                self.label_35.setText(f"{row[3]} EUTS")
            if i['name'] == row[7]:
                self.label_13.setText(f"{i['damage']} ATK")
                self.label_17.setText(f"{i['speed']} SPD")
                self.label_21.setText(row[8])
                self.label_25.setText(i['element'])
                self.label_36.setText(f"{row[6]} EUTS")
            if i['name'] == row[4]:
                self.label_14.setText(f"{i['damage']} ATK")
                self.label_18.setText(f"{i['speed']} SPD")
                self.label_22.setText(row[5])
                self.label_26.setText(i['element'])
                self.label_37.setText(f"{row[9]} EUTS")
            if i['name'] == row[1]:
                self.label_15.setText(f"{i['damage']} ATK")
                self.label_19.setText(f"{i['speed']} SPD")
                self.label_23.setText(row[2])
                self.label_27.setText(i['element'])
                self.label_38.setText(f"{row[12]} EUTS")
        self.label_28.setText('NO INFORMATION')
        self.label_29.setText('NO INFORMATION')
        self.label_30.setText('NO INFROMATION')
        self.label_31.setText('NO INFORMATION')
        self.label_33.setText(str(row[13]))
        self.Timer.setText(f'{time_update} SEC')
        ### Просто подставление значений ###
        self.sqlite_close_weapon()

    def exit_main(self):
        self.destroy()
        print('Выполняю выход')
        minutes_main_menu.main_table().shop_open.setEnabled(True)
        # Выход в основной файл

    def sqlite_connect_weapon(self):
        conn = sqlite3.connect(f'C:/Users/{os.getlogin()}/appdata/Roaming/5min.db', timeout=1) # Подключение к файлу базы
        cur = conn.cursor()
        cur.execute('SELECT * FROM SHOP_ACTIVE')
        row = cur.fetchone()
        return conn, cur, row

    def sqlite_close_weapon(self):
        conn, cur, row = self.sqlite_connect_weapon()
        conn.commit()
        cur.close()
        conn.close() # Закрытие подключений

    def update_sqlite(self):
        conn, cur, row = self.sqlite_connect_weapon()
        cur.execute('DELETE FROM SHOP_ACTIVE') # Очистка базы на всякий случай, дабы не было дублирования
        login = sqlite_logic.give_login()[0] # Получение логина аккаунта
        self.sqlite_close_weapon()
        sqlite_logic.close_connection()
        # Закрытие обоих баз данных.
        first_weapon, second_weapon, three_weapon, fourble_weapon = Weapon_handler.data['weapon']['swords'][
                                                                        self.get_int(0)], \
                                                                    Weapon_handler.data['weapon']['swords'][
                                                                        self.get_int(0)], \
                                                                    Weapon_handler.data['weapon']['swords'][
                                                                        self.get_int(0)], \
                                                                    Weapon_handler.data['weapon']['swords'][
                                                                        self.get_int(0)]
        # Получение из JSON названия по рандому
        first_enchant, second_enchant, three_enchant, fourble_enchant = Weapon_handler.data['enchant'][
                                                                            self.get_int(1)], \
                                                                        Weapon_handler.data['enchant'][
                                                                            self.get_int(1)], \
                                                                        Weapon_handler.data['enchant'][
                                                                            self.get_int(1)], \
                                                                        Weapon_handler.data['enchant'][
                                                                            self.get_int(1)]
        # Получение из JSON энчантов по рандому
        first_price, second_price, three_price, fourble_price = random.randint(7, 77) * first_enchant[
            0], random.randint(7, 77) * second_enchant[0], random.randint(7, 77) * three_enchant[0], random.randint(
            7, 77) * fourble_enchant[0]
        # Рандомная цена
        if first_enchant[2] == 'Mythic':
            first_price = int(first_price) * 4
        if second_enchant[2] == 'Mythic':
            second_price = int(second_price) * 4
        if second_enchant[2] == 'Mythic':
            three_price = int(three_price) * 4
        if second_enchant[2] == 'Mythic':
            fourble_price = int(fourble_price) * 4
        # Умножение цен если мифик оружие
        heals = random.randint(0, 20)
        # Кол-во хилок на продажу
        time_start = time.time()
        # Начало отсчета для 30 строки
        price_list = (
            login, first_weapon['name'], first_enchant[2], first_price, second_weapon['name'], second_enchant[2],
            second_price, three_weapon['name'], three_enchant[2], three_price, fourble_weapon['name'],
            fourble_enchant[2], fourble_price, heals, time_start)
        # Список для вноса в базу данных
        conn, cur, row = self.sqlite_connect_weapon()

        cur.execute('insert into SHOP_ACTIVE values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', price_list)
        conn.commit()
        #Внос
        self.sqlite_close_weapon()

    def get_int(self, query):
        ## Рандом для оружия ##
        if query == 0:
            return random.randint(0, 16)
        if query == 1:
            integ = random.randint(0, 4)
            if integ == 0:
                return 'simple'
            if integ == 1:
                return 'rare'
            if integ == 2:
                return 'epic'
            if integ == 3:
                return 'legendary'
            if integ == 4:
                return 'mythic'

## Основной рендер окон ###
class windows_render:

    def __init__(self):
        self.windows = [logic_shop]

    def render_main_windows(self):
        app = QtWidgets.QApplication(sys.argv)
        self.windows[0]().show()
        app.exec_()


if __name__ == '__main__':
    windows_render().render_main_windows()


Перед новым открытием я ее заново закрываю, но сути дела не меняет. Она все равно остается заблокированной. Timeout не помогает.
Модули не прикрепляю, Вроде не особо нужны.
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
@animanshnik Автор вопроса
Решил проблему. Вынес insert за функцию, помогло. Костыльно конечно..
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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