SQLITE:不保存数据库更改并且删除所有条目而不是一个条目

SQLITE: Database change are not saved and all entries are deleted instead than one

我使用在线教程创建了我的 SQLITE3 数据库,其中记录加载到 tkinter 条目中,然后从那里保存。在教程中有一个 id_entry 用于 remove_one、remove_many、remove_all 和 update_record 函数。我已经删除了该条目,并尝试改用“rowid”,但不幸的是我的代码无法正常工作: 使用 remove_one 时,它只删除了一条记录,但是当我关闭我的应用程序并重新启动时,每条记录都丢失了。 remove_manyupdate_record 实际上有效,但是当我关闭并再次打开应用程序时,更改不会保存。 我想了解我做错了什么。谢谢您的帮助! P.S.(我对代码做了一些修改,让它更短更容易理解,如果有一些不一致可能是原因。现在的代码根本不会给我任何类型的错误)

创建数据库

        conn = sqlite3.connect('records_list.db')

        c = conn.cursor()

        c.execute("""CREATE TABLE if not exists records (
            author text,
            year text,
            title text,
            page text,
            """)

        conn.commit()

        conn.close()

查询数据库

        def query_database():
            global count
            count = 0

            for record in record_tree.get_children():
                record_tree.delete(record)
                
            conn = sqlite3.connect('records_list.db')

            c = conn.cursor()

            c.execute("SELECT rowid, * FROM records")
            records = c.fetchall()

            for record in records:         
                if count % 2 == 0:
                    record_tree.insert(parent='', index='end', iid=count, text='', values=(record[1], record[2], record[3], record[4], tags=('evenrow',))
                else:
                    record_tree.insert(parent='', index='end', iid=count, text='', values=(record[1], record[2], record[3], record[4], tags=('oddrow',))

                count += 1

            conn.commit()

            conn.close()

删除多个

        def remove_many():
            response = messagebox.askyesno("WOAH!!!!", "This Will Delete EVERYTHING SELECTED From The Table\nAre You Sure?!")

            if response == 1:
                x = record_tree.selection()

                ids_to_delete = []
                
                for record in x:
                    ids_to_delete.append(record_tree.item(record, 'values')[0])

                for record in x:
                    record_tree.delete(record)

                conn = sqlite3.connect('records_list.db')

                c = conn.cursor()
                
                c.executemany("DELETE FROM records WHERE rowid = ?", [(a,) for a in ids_to_delete])

                ids_to_delete = []

                conn.commit()

                conn.close()

                clear_entries()

删除一个

        def remove_one():
            x = record_tree.selection()[0]
            record_tree.delete(x)

            conn = sqlite3.connect('records_list.db')

            c = conn.cursor()

            c.execute("DELETE from records WHERE oid=" + 'rowid')
            
            conn.commit()

            conn.close()

            clear_entries()

            messagebox.showinfo("Deleted!", "Your record Has Been Deleted!")

update_record

        def update_record():
            selected = record_tree.focus()
            record_tree.item(selected, text="", values=(author_entry.get(), year_entry.get(), title_entry.get(), journal_entry.get(), volume_entry.get(), number_entry.get(), page_entry.get(), doi_entry.get(),))

            conn = sqlite3.connect('records_list.db')

            c = conn.cursor()

            c.execute("SELECT rowid, * FROM records")
            records = c.fetchall()

            c.execute("""UPDATE records SET
                author = :author,
                year = :year,
                title = :title,
                page = :page,


                WHERE oid = :oid""",
                {
                    'author': author_entry.get(),
                    'year': year_entry.get(),
                    'title': title_entry.get(),
                    'page': page_entry.get(),
                    'oid': "rowid",
                })
            
            conn.commit()

            conn.close()

            clear_entries()

主要问题是 xrecord_tree.selection()[0] 的结果)和 selectedrecord_tree.focus() 的结果)的值不是实际的 rowid 在数据库中。将记录插入树视图时需要保存 rowidiid 选项:

c.execute("SELECT rowid, * FROM records")
records = c.fetchall()

count = 0
for record in records:         
    if count % 2 == 0:
        # record[0] is the rowid
        record_tree.insert(parent='', index='end', iid=record[0], values=(record[1], record[2], record[3], record[4]), tags=('evenrow',))
    else:
        record_tree.insert(parent='', index='end', iid=record[0], values=(record[1], record[2], record[3], record[4]), tags=('oddrow',))

    count += 1

然后在树视图中删除所选记录:

...
selected = record_tree.selection()
if selected:
    record_tree.delete(selected[0])
    c.execute('DELETE FROM records WHERE rowid = ?', (selected[0],))
    conn.commit()
    ...

类似的逻辑适用于更新记录。