#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.