我将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()
非常感谢您的帮助。
答案 0 :(得分:1)
我的问题的解决方案是:我很愚蠢! 昨天晚上我很累,在一个与我的python程序同名的子文件夹中查看了错误的sql文件。因此它实际上正在工作。请原谅我的愚蠢。
@Bruceskyaus 尽管我很愚蠢,但我还是从您的回答中学到了,特别是尝试...除外。我将执行它。谢谢。
答案 1 :(得分:0)
您可能在控制数据库上的事务时遇到问题,但是也可能是连接本身。确保您在不同的连接上没有未提交的DML语句(例如,未提交的INSERT
,UPDATE
或DELETE
在数据库浏览器中),这可能会导致conn.commit()
失败。使用SQLite,未提交的事务可以在短时间内锁定整个数据库。
尝试确保删除语句有新的光标,并在conn.close()
之后调用conn.commit()
。在执行代码之前,请确保没有其他连接正在访问数据库-包括数据库浏览器。仅在关闭应用程序后(在此测试中),才签入数据库浏览器。这样就消除了多线程或锁定的可能原因。另请参见SQLite - Data Persistence和SQLite - Controlling Transactions
使用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()