Несоответствие между моими данными Python SQL и браузером БД - PullRequest
0 голосов
/ 14 ноября 2018

Я использую 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 ]

0 голосов
/ 14 ноября 2018

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

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

0 голосов
/ 14 ноября 2018

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

Попробуйте убедиться в наличии нового курсора для оператора delete и вызовите 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()
...