-1

我正在使用 sqlite 结合 tkinter 在我的 Python 程序中写入和删除记录。删除在我的程序中运行良好,当我重新启动程序时,记录不再存在。但是,我总是使用 Linux 标准软件 DB Browser for SQLite 进行交叉检查并查看我的 SQL 表。奇怪的是,所有记录仍然存在于数据库浏览器中。现在我想知道,为什么会这样?为什么它在我的 Python sqlite 查询中消失了,但在 DB 浏览器中却没有?不知何故,这些记录仍然存在。如何彻底销毁我的记录?

对于删除,我使用:(用户可以使用列表框选择特定条目。最终,我将所选项目“翻译”为其特定 ID 并触发删除。)

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()

非常感谢您的帮助。

4

2 回答 2

1

我的问题的解决方案是:我很愚蠢!昨天晚上我很累,在一个与我的 python 程序同名的子文件夹中查看了错误的 sql 文件。所以它实际上是有效的。请原谅我的愚蠢。

@Bruceskyaus 尽管我很愚蠢,但我还是从您的回答中学到了,尤其是 try ... except 块。我将实施它。谢谢。

于 2018-11-14T16:21:49.773 回答
0

您可能在控制数据库上的事务时遇到问题,但也可能是连接本身。确保在不同的连接上没有任何未提交的 DML 语句(即INSERTUPDATEDELETE在未提交的数据库浏览器中),这可能会导致conn.commit()失败。使用 SQLite,未提交的事务可以锁定整个数据库 - 一段短暂的时间。

尝试确保删除语句有一个新游标并conn.close()conn.commit(). 在执行代码之前,请确保没有其他连接正在访问数据库 - 包括 DB Browser。仅在关闭应用程序时才检查数据库浏览器(对于此测试)。这消除了多线程或锁定作为可能的原因。另请参阅SQLite - 数据持久性SQLite - 控制事务

try...except使用块捕获 DML 语句的所有错误也很有帮助。像这样的东西:

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()
于 2018-11-13T22:42:34.127 回答