【问题标题】:Problems with update and delete functions更新和删除功能的问题
【发布时间】:2020-11-09 19:11:33
【问题描述】:

我有一个简单的程序“电话簿”。这两个函数中的一个函数是更新一个记录函数,但是当我尝试更新单个记录/行时,它会更新插入一个记录的所有记录。我也有单个选定行的删除功能,当我按下删除按钮时,它会引发以下错误:

c.execute("DELETE FROM profile WHERE First=?, Surname=?, phone_number=?") sqlite3.OperationalError: near ",": syntax error. 

这是我的代码:

def create_sql():
conn = sqlite3.connect("phone_book.db")
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS profile (First TEXT, Surname TEXT, phone_number TEXT)")
conn.commit()
conn.close()
def get_row(event):
    try:
        cursor = tree.focus()
        content = tree.item(cursor)
        row = content["values"]
        one.set(row[0])
        two.set(row[1])
        three.set(row[2])
    except IndexError:
        pass
def update():
data1 = one.get()
data2 = two.get()
data3 = three.get()
cursor = tree.focus()
content = tree.item(cursor)
row = content["values"]
one.set(row[0])
two.set(row[1])
three.set(row[2])
conn = sqlite3.connect("phone_book.db")
cur = conn.cursor()
cur.execute("""UPDATE profile SET First=?, Surname=?, phone_number=?""", (data1, data2, data3,tree.set(row)))
conn.commit()
conn.close()
def del_sel():
    try:
        selected_item = tree.selection()[0] ## get selected item
        tree.delete(selected_item)
    except IndexError:
        pass
    conn = sqlite3.connect("phone_book.db")
    c = conn.cursor()
    c.execute("DELETE FROM profile WHERE First=? AND Surname=? AND phone_number=?"(data1, data2, data3) )
    conn.commit()
    conn.close()
def add_contact():
    if e.get() == "" and e1.get() =="" and e2.get() =="":
        messagebox.showwarning("Input Error","Przyjmniej jedno pole\nmusi być wypełnione")
    else:
        conn = sqlite3.connect("phone_book.db")
        c = conn.cursor()
        c.execute("INSERT INTO profile VALUES(:e,:e1,:e2)",
                {
                    'e':e.get(),
                    'e1':e1.get(),
                    'e2':e2.get()
                }
        )
        conn.commit()
        conn.close()
        tree.insert("",'end',values=(e.get(),e1.get(),e2.get()))
        e.delete(0,END)
        e1.delete(0,END)
        e2.delete(0,END)
    e = Entry(root,bd=2,textvariable=one)
e.grid(row=0,column=1,padx=10,pady=5)
e1 = Entry(root,bd=2,textvariable=two)
e1.grid(row=1,column=1,padx=10,pady=5)
e2 = Entry(root,bd=2,textvariable=three)
e2.grid(row=2,column=1,padx=10,pady=5)
e3 = Entry(root,bd=2)
e3.grid(row=5,column=1,pady=5)

tree = ttk.Treeview(root,height=10)
tree["columns"]=("one","two","three")
tree.column("one",width=120)
tree.column("two",width=130)
tree.column("three",width=160)
tree.heading("one", text="Imię")
tree.heading("two", text="Nazwisko")
tree.heading("three", text="Nr Telefonu")
tree["show"]="headings"
tree.grid(row=4,column=0,columnspan=6,padx=20)

【问题讨论】:

    标签: python sqlite tkinter


    【解决方案1】:

    更新语句应该有一个像这样的WHERE 子句:

    UPDATE profile SET First=?, Surname=?, phone_number=? WHERE id=?
    

    因此只有您必须作为第四个参数传递的带有id 的行才会被更新。
    id 更改为作为表主键的列的名称。

    或者在WHERE 子句中使用FirstSurname 列:

    UPDATE profile SET First=?, Surname=?, phone_number=? WHERE First=? AND Surname=?
    

    这意味着您必须将要更新的行的名称和姓氏作为第 4 和第 5 个参数传递。

    对于DELETE 语句,正确的语法是:

    DELETE FROM profile WHERE First=? AND Surname=? AND phone_number=?
    

    您还应该为 ? 占位符传递 3 个参数,就像为 UPDATE 语句所做的那样。

    【讨论】:

    • (用于更新)所以我必须添加带有 ID 的第 4 列?
    • 表中没有主键吗?一个独特的列?
    • 我在上面的代码中添加了在 sqlite3 中创建表的函数,我应该添加其他吗?
    • 表中没有主键。所以问题是:当你想更新一行时,只有 1 行,你将如何确保只有 1 行会被更新?请参阅我编辑的答案。
    • 我有一个错误 cur.execute("""UPDATE profile SET First=?, Surname=?, phone_number=? WHERE First=? AND Surname=?""", (data1, data2, data3)) sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 5,提供了 3 个。
    猜你喜欢
    • 2017-05-17
    • 2019-07-31
    • 2018-01-31
    • 2019-11-07
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多