GOOGLE ADS

четверг, 28 апреля 2022 г.

SQLITE: изменение базы данных не сохраняется, и все записи удаляются вместо одной

Я создал свою базу данных SQLITE3, используя онлайн-учебник, где записи загружались в записи tkinter, а затем сохранялись оттуда. В учебнике была id_entry, которая использовалась для функции remove_one, remove_many, remove_all и update_record. Я удалил эту запись и пытаюсь вместо этого использовать «rowid», но, к сожалению, мой код не работает: при использовании remove_one удаляется только одна запись, но когда я закрываю приложение и перезапускаю, все записи отсутствуют.
remove_many и update_recordна самом деле работает, но когда я закрываю и снова открываю приложение, изменения не сохраняются. Я хотел бы понять, что я делаю неправильно. Спасибо за помощь! PS (я внес некоторые изменения в код, чтобы сделать его короче и понятнее, если есть какое-то несоответствие, это может быть причиной. Код прямо сейчас не возвращает мне никаких ошибок вообще)

Создать базу данных

 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в базе данных. Вам нужно сохранить параметр rowidto 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()
...

Аналогичная логика применяется при обновлении записи.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...