Удаление из базы данных выделения в listbox

#python #sqlite

#python #sqlite

Вопрос:

У меня в основном есть 2 скрипта на Python, один для интерфейса, другой для серверной части. Во внешнем интерфейсе у меня есть это:

 def delete_command():
    back.delete(selected_tuple[0])
  

Итак, в основном нажимаем на запись в listbox, затем в серверном скрипте вызывается вызов базы данных (sqllite3)

 def delete(id):
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    db_path = os.path.join(BASE_DIR, "AVDatabase.db")
    conn=sqlite3.connect(db_path)
    cur=conn.cursor()
    cur.execute('DELETE * FROM "Books"  where BookId=?',(BookId,))
    conn.commit()
    conn.close()
  

Но я продолжаю получать сообщение об ошибке:

 cur.execute('DELETE * FROM "Books"  where BookId=?',(BookId,))
NameError: name 'BookId' is not defined
  

База данных уже существует, поэтому она не создается динамически, не уверен, почему она рассматривает BookID столбец как не определенный, BookID это целое число с первичным ключом в таблице main Books.

Комментарии:

1. Я предлагаю вам использовать sqlalchemy.

2. Я не использовал SQLAlchemy.

3. Где определяется BookID , переменная в сравнении со столбцом таблицы? Похоже, что это связано с переменной, а не с содержимым вашего оператора SQL. Это ошибка времени компиляции, а не ошибка времени выполнения, верно? Мне кажется, что этот символ просто не определен.

4. Bookid определяется только как виджет ввода, который заполняется из listbox. В принципе, я выбираю запись в окне списка и хотел передать, скажем, столбец BookID из таблицы Books в инструкцию Delete.

5. BookId_text=IntVar() запись 1=Entry(window,textvariable=int(float(BookId_text.get()))) запись 1.grid(строка = 1, столбец = 1)

Ответ №1:

Вы не определяете BookId .

Для delete() метода требуется параметр с именем id , и вы не используете его нигде в определении.

замените BookId на id здесь: cur.execute('DELETE * FROM "Books" where BookId=?',(BookId,)) на cur.execute('DELETE * FROM "Books" where BookId=?',(id,))

 def delete(id):
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    db_path = os.path.join(BASE_DIR, "AVDatabase.db")
    conn=sqlite3.connect(db_path)
    cur=conn.cursor()
    cur.execute('DELETE * FROM "Books"  where BookId=?',(id,))
    conn.commit()
    conn.close()
  

Комментарии:

1. Спасибо, что сделал это, Данке.

Ответ №2:

Это не имеет никакого отношения к тому, что находится в вашей базе данных, или даже к самой инструкции SQL. Вы просто не определили BookID. Этот код вызывает ту же ошибку:

 class Cur:
    def execute(self, statement, values):
        pass

cur = Cur()
cur.execute('DELETE * FROM "Books"  where BookId=?',(BookId,))
  

Результат:

 Traceback (most recent call last):
  File "...", line 10, in <module>
    cur.execute('DELETE * FROM "Books"  where BookId=?',(BookId,))
NameError: name 'BookId' is not defined
  

Измените BookID на id, как говорит @Powertieke.