Несоответствие между моими данными Python SQL и браузером БД

Я использую sqlite в сочетании с tkinter для записи и удаления записей в моей программе Python. Удаление отлично работает в моей программе, а также, когда я перезапускаю программу, запись больше не существует. Однако я всегда проверяю, используя стандартный программный браузер БД для Linux для SQLite, и смотрю на свою таблицу SQL. Как ни странно, все записи все еще существуют в браузере БД. Теперь мне интересно, почему это? Почему это происходит в моих Python-запросах sqlite, а не в браузере БД? Каким-то образом записи все еще там. Как я могу полностью уничтожить мои записи?

Для удаления я использую: (Пользователь может выбрать конкретную запись, используя список. В конце концов, я "преобразовываю" выбранный элемент в его конкретный идентификатор и запускаю удаление.)

self.c.execute("DELETE FROM financial_table WHERE ID=?",(entry,))
self.conn.commit()

Для своего запроса я использую: (Я запрашиваю данные за определенный год и месяц.)

self.c.execute("SELECT ID, Date, Item, Price FROM financial_table WHERE strftime('%Y-%m', Date) = '{}' ORDER BY Date ".format(date))
single_dates = self.c.fetchall()

Большое спасибо за Вашу помощь.

2 ответа

Решение моего вопроса: я тупой! Вчера вечером я устал и посмотрел на неверный файл sql в подпапке с тем же именем, что и в моей программе на python. Так что на самом деле это работает. Пожалуйста, извините за мою глупость.

@Bruceskyaus Несмотря на мою глупость, я узнал из твоего ответа, особенно попробуй... кроме блока. Я собираюсь реализовать это. Благодарю.

У вас могут быть проблемы с управлением транзакциями в вашей базе данных, но это может быть и само соединение. Убедитесь, что у вас нет неподтвержденных операторов DML для другого соединения (т.е. INSERT, UPDATE или же DELETE в вашем браузере БД, который не был зафиксирован), это может привести к conn.commit() терпеть неудачу. С SQLite незафиксированная транзакция может заблокировать всю базу данных - на короткий промежуток времени.

Попробуйте убедиться, что есть новый курсор для оператора удаления и вызовите conn.close() после conn.commit(), Перед выполнением кода убедитесь, что никакие другие соединения не обращаются к базе данных, включая браузер БД. Проверяйте БД в браузере только после закрытия приложения (для этого теста). Это исключает многопоточность или блокировку как возможную причину. См. Также SQLite - Постоянство данных и SQLite - Управление транзакциями

Также полезно отлавливать все ошибки для операторов DML, используя try...except блок. Что-то вроде этого:

import sqlite3

try:
    self.conn = sqlite3.connect('mydb.db')
    self.c = conn.cursor()    
    self.c.execute("DELETE FROM financial_table WHERE ID=?",(entry,))
    self.conn.commit()
except sqlite3.Error as e:
    print("An error occurred:", e.args[0])
finally:
    self.conn.close()
Другие вопросы по тегам