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_many 和 update_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()
主要问题是 x
(record_tree.selection()[0]
的结果)和 selected
(record_tree.focus()
的结果)的值不是实际的 rowid
在数据库中。将记录插入树视图时需要保存 rowid
到 iid
选项:
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()
...
类似的逻辑适用于更新记录。
我使用在线教程创建了我的 SQLITE3 数据库,其中记录加载到 tkinter 条目中,然后从那里保存。在教程中有一个 id_entry 用于 remove_one、remove_many、remove_all 和 update_record 函数。我已经删除了该条目,并尝试改用“rowid”,但不幸的是我的代码无法正常工作: 使用 remove_one 时,它只删除了一条记录,但是当我关闭我的应用程序并重新启动时,每条记录都丢失了。 remove_many 和 update_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()
主要问题是 x
(record_tree.selection()[0]
的结果)和 selected
(record_tree.focus()
的结果)的值不是实际的 rowid
在数据库中。将记录插入树视图时需要保存 rowid
到 iid
选项:
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()
...
类似的逻辑适用于更新记录。