为了账号安全,请及时绑定邮箱和手机立即绑定

我的 SQL python 数据和数据库浏览器之间的差异

我的 SQL python 数据和数据库浏览器之间的差异

aluckdog 2021-08-17 10:57:41
我将 sqlite 与 tkinter 结合使用在我的 Python 程序中写入和删除记录。删除在我的程序中工作得很好,而且当我重新启动程序时,该记录不再存在。但是,我总是使用 Linux 标准软件 DB Browser for SQLite 进行交叉检查,并查看我的 SQL 表。奇怪的是,所有记录仍然存在于数据库浏览器中。现在我想知道,这是为什么?为什么它在我的 Python sqlite 查询中消失了,而在数据库浏览器中没有?不知何故,这些记录仍然存在。我怎样才能彻底销毁我的记录?对于删除,我使用:(用户可以使用列表框选择特定条目。最终,我将所选项目“翻译”为其特定 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()非常感谢您的帮助。
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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



查看完整回答
反对 回复 2021-08-17
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

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


尝试确保删除语句有一个新游标并conn.close()在conn.commit(). 在执行代码之前,请确保没有其他连接正在访问数据库 - 包括 DB 浏览器。仅在您关闭应用程序后(对于此测试)才签入 DB 浏览器。这消除了多线程或锁定作为可能的原因。另请参阅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()


查看完整回答
反对 回复 2021-08-17
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信