#python #sqlite #tkinter #treeview
Вопрос:
from tkinter import *
import sqlite3
app = Tk()
app.geometry('1000x600')
def remove_one():
x = my_tree.selection()[0]
my_tree.delete(x)
conn = sqlite3.connect('CustomerRecords.db')
c = conn.cursor()
rowid = c.lastrowid
c.execute("DELETE from customers WHERE rowid = ", (rowid))
conn.commit()
conn.close()
remove_one_button = Button(button_frame, text = 'Remove Record', command= remove_one)
remove_one_button.grid(row =0, column=2, padx = 10, pady = 10)
app.mainloop()
выход:
sqlite3.Ошибка операции: неполный ввод
Я хочу иметь возможность удалить строку из базы данных sqlite3, используя идентификатор строки, который естественным образом присваивается каждой строке
Комментарии:
1. Что вы подразумеваете под «неполным вводом»?
2. Разве это не должно быть на самом
c.execute("DELETE from customers WHERE rowid = ", (rowid))
делеc.execute("DELETE from customers WHERE rowid = ?", (rowid, ))
? Я мало что знаю о SQL, поэтому ничего не могу сказать с уверенностью.3. Что вы ожидаете получить
c.lastrowid
сразу после подключения к базе данных?
Ответ №1:
Оператор DELETE SQL явно неполон, он должен быть:
c.execute("DELETE from customers WHERE rowid = ?", (rowid,))
Как его получить rowid
? Если вы вставите эти записи в my_tree
, как показано ниже:
conn = sqlite3.connect('CustomerRecords.db')
c = conn.cursor()
c.execute('SELECT rowid, * FROM customers')
for row in c:
# use `iid` option to store the rowid
my_tree.insert('', 'end', iid=row[0], values=row[1:])
conn.close()
Затем вы можете использовать my_tree.selection()[0]
(вы уже сделали это remove_one()
), чтобы получить идентификатор строки выбранной строки.
Ниже приведена измененная remove_one()
:
def remove_one():
selected = my_tree.selection()
if selected:
rowid = selected[0]
my_tree.delete(rowid)
conn = sqlite3.connect('CustomerRecords.db')
c = conn.cursor()
c.execute("DELETE from customers WHERE rowid = ?", (rowid,))
conn.commit()
conn.close()
else:
print("No record selected")