Несоответствие между моими данными 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()