Ошибка с нахождением таблицы в бд SQLite3

Рейтинг: 0Ответов: 2Опубликовано: 12.05.2023

При написании программы столкнулся с проблемой, а именно записью в бд данных.

У меня есть таблицы, и когда я пытаюсь записывать в них данные, мне пишет следующую ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\david\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "c:\Users\david\OneDrive\Рабочий стол\Order_1\main.py", line 137, in save_data
    cursor.executemany(f"INSERT INTO {self.parent.select_text}(pair, predmet, den, time_start, time_end) VALUES(?,?,?,?,?)", data)
sqlite3.OperationalError: no such table: ИС911

Вот мой код:

import tkinter as tk
from tkinter import *
from tkinter import messagebox
import sqlite3


class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title("Расписание занятий студента")
        self.master.geometry("500x500")
        self.master.resizable(False, False)
        self.master.iconbitmap("Icon.ico")
        self.pack()
        self.conn = sqlite3.connect('schedule.db')
        self.create_widgets()
        self.create_datebase()


    def create_widgets(self):

        # Дополняй свой список групп.
        self.options = ["Выберите группу", "ИС-911", "ИС-912", "ИС-913"]
        self.selected_option = tk.StringVar()
        self.selected_option.set(self.options[0])
        self.option_menu = tk.OptionMenu(self, self.selected_option, *self.options)
        self.option_menu.configure(width=50)
        self.option_menu.pack()
        self.select_text = None # Создание атрибута для хранения значения.


        def on_select_option(*args):
            self.select_text = self.selected_option.get().replace("-", "")

            if self.select_text == "Выберите группу":
                print("Необходимо выбрать группу для работы в приложении")
            else:
                self.create_datebase()

        self.selected_option.trace("w", on_select_option)
    
        self.button = tk.Button(self, text="Пара/Предмет") 
        self.button.configure(width=40)
        self.button.pack(pady = (50, 0))

        self.button_edit = tk.Button(self, text="Заполнить БД", command=self.open_fillingDataBase) 
        self.button_edit.configure(width=40)
        self.button_edit.pack(side="top")

    def create_datebase(self):
        
        cursor = self.conn.cursor()
        if self.select_text == None:
            print("Таблица не содержит имени")
        else:
            cursor.execute(f"""CREATE TABLE IF NOT EXISTS {self.select_text}(
            pair INTEGER,
            predmet TEXT,
            week_type BOOLEAN CHECK (week_type IN (0, 1)),
            den TEXT,
            time_start TEXT,
            time_end TEXT
            );
            """)

            cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
            print(cursor.fetchall())
 

    def open_fillingDataBase(self):
        child_window = FillingDataBase(self)
        self.button_edit.config(state="disabled")

    def on_close(self):
        self.button_edit.config(state="normal")


class FillingDataBase(tk.Toplevel):
    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent
        self.protocol("WM_DELETE_WINDOW", self.on_close)

        self.title("Расписание занятий студента")
        self.geometry("500x500")
        self.resizable(False, False)
        self.iconbitmap("Icon.ico")

        self.day_var = tk.StringVar()
        self.day_var.set("Понедельник")
        self.day_label = tk.Label(self, text="День недели:")
        self.day_label.pack()
        self.day_entry = tk.Entry(self, textvariable=self.day_var)
        self.day_entry.pack()

        self.table = tk.Frame(self)
        self.table.pack()

        self.create_table()

    def create_table(self):
        headings = ["Номер пары", "Предмет", "Время начала", "Время конца"]
        for i, heading in enumerate(headings):
            label = tk.Label(self.table, text=heading, font=("Arial", 12, "bold"), padx=5, pady=5, borderwidth=2, relief="groove")
            label.grid(row=0, column=i, sticky="nsew")

        for i in range(1, 7):
            pair_label = tk.Label(self.table, text=str(i), font=("Arial", 12, "bold"), padx=5, pady=5, borderwidth=2, relief="groove")
            pair_label.grid(row=i, column=0, sticky="nsew")

            predmet_entry = tk.Entry(self.table)
            predmet_entry.grid(row=i, column=1, sticky="nsew")

            time_start_entry = tk.Entry(self.table)
            time_start_entry.grid(row=i, column=2, sticky="nsew")

            time_end_entry = tk.Entry(self.table)
            time_end_entry.grid(row=i, column=3, sticky="nsew")

        save_button = tk.Button(self, text="Сохранить", command=self.save_data)
        save_button.pack(pady=10)

    def save_data(self):
        day = self.day_var.get()
        data = []
        for i in range(1, 7):
            pair = i
            predmet = self.table.grid_slaves(row=i, column=1)[0].get()
            time_start = self.table.grid_slaves(row=i, column=2)[0].get()
            time_end = self.table.grid_slaves(row=i, column=3)[0].get()
            data.append((pair, predmet, day, time_start, time_end))


        cursor = self.parent.conn.cursor()
        cursor.execute(f"DROP TABLE {self.parent.select_text}")
        cursor.executemany(f"INSERT INTO {self.parent.select_text}(pair, predmet, den, time_start, time_end) VALUES(?,?,?,?,?)", data)
        cursor.execute(f"SELECT * FROM {self.parent.select_text}")
        print(cursor.fetchall())


    def on_close(self):
        self.destroy()
        self.parent.on_close()



if __name__ == "__main__":
    root = tk.Tk()
    app = App(master=root)
    app.mainloop()

Возможно, многим покажется, что код написан новичком, так собственно оно и есть, учу язык программирования python, это мой первый яп.

Если увидите в моей программе недостатки или, возможно, написано абсолютно некорректно, - прошу помочь улучшить мои способности и помочь с исправлением нынешних и будущих ошибок.

Ответы

▲ 1Принят

Наверное это ошибка типичного новичка как я, вся проблема в этой строке:

        cursor.execute(f"DROP TABLE {self.parent.select_text}")

Это 136 строка, перед тем как заполнить таблицу новыми значениями я хотел её очистить от старых значений, и по не знанию удалял её перед тем как заполнить. Для будущих новичков лишь один совет, перепроверяйте то, что добавляете в код, возможно оно работает не так как вы думаете.

▲ 1

у вас ошибка в коде

 def on_select_option(*args):
            self.select_text = self.selected_option.get().replace("-", "")

            if self.select_text == "Выберите группу":
                print("Необходимо выбрать группу для работы в приложении")
            else:
                self.create_dat->e<-base()
 должно быть database