sqlite3/tkinter: как удалить строку treeview с помощью rowid из базы данных

#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")