我有一个已经使用sqlite在python3中内置的数据库。到目前为止,提交保存更改(使用插入命令和删除命令)没有任何问题。但是,我试图利用更新命令,但无法保存更改(尽管调用commit(),它仅更改了工作内存中的数据库。
此代码段的目标是用一个空字符串替换数据库中的空值,因为我还有另一个无法处理空数据的函数。我在这里找到了解决方案:Find null values from table and replace it with space - sqlite。
这是我要执行的当前代码:
self.cursor.execute(f'UPDATE {tbl_name} SET {col_name} = IFNULL({col_name}, "")')
self.conn.commit()
这段代码基本上一次遍历整个数据库的一列,并替换了空值。
请注意,自我定义如下:
Database.conn = sqlite3.connect(self.location + self.name)
Database.cursor = sqlite3.connect(self.location + self.name).cursor()
如前所述,这可以正常运行;但是,它不会将更改提交到实际数据库。这两个数据库浏览器都针对sqlite进行了验证,并再次关闭并再次执行数据。
我还将注意到,如果我退出该程序并重新初始化以再次运行它,则尽管我的代码的最后一行是:
Database.conn.commit() # Save (commit) the changes
Database.conn.close() # Close database
预先感谢,因为我一直在用这个把头撞在墙上,但是还没有在其他地方找到这样的问题!
答案 0 :(得分:1)
您的数据库连接与光标无关。
你做
Database.conn = sqlite3.connect(self.location + self.name)
Database.cursor = sqlite3.connect(self.location + self.name).cursor()
因此,通过为光标创建新的连接,后面的Database.conn.commit()
将不会提交您对cursor
所做的任何更改。
像这样创建游标,以在连接和游标之间建立连接:
Database.conn = sqlite3.connect(self.location + self.name)
Database.cursor = Database.conn.cursor()