sqlite3.ProgrammingError:无法在已关闭的数据库上运行. [Python] [sqlite]

sqlite3.ProgrammingError:无法在已关闭的数据库上运行. [Python] [sqlite],第1张

概述我正在使用一个通用函数来执行类中的所有sqlite查询.一切正常,直到我在列表中使用带有多个项目的for循环. 这是执行sqlite查询的常用函数: def executeQuery(self, query, params = ()): results = {} try: cur = self.conn.cursor() 我正在使用一个通用函数来执行类中的所有sqlite查询.一切正常,直到我在列表中使用带有多个项目的for循环.

这是执行sqlite查询的常用函数:

def executequery(self,query,params = ()):        results = {}        try:            cur = self.conn.cursor()            cur.execute(query,params)            self.conn.commit()            rows = cur.fetchall()            results['status'] = 'success'            result = []            if rows:                column = map(lambda x: x[0],cur.description)                for row in rows:                    result.append( dict(zip(column,row)) )            results['results'] = result        except self.conn.Error,e:            if self.conn:                self.conn.rollback()            print "Error: %s" % e.args[0]            results['status'] = 'failure'            results['results'] = e.args[0]        finally:            if self.conn:                self.conn.close()        return results

这是让我得到数据库关闭错误的循环:

stages = self.getStageByDate(2000)        for stage in stages['results']:            print stage['name']            additives = self.getStageAdditives(stage['name'])            print additives            for additive in additives['results']:                print additive

错误似乎来自getStageAdditives(),因为它返回4个项目,而getStageByDate()仅返回1.

在我看来,在尝试第二次连接之前,没有关闭与数据库的连接.为什么会这样?与MysqL数据库一起使用时没有发生.这个问题的解决方案是什么?

解决方法 您写道“在我看来,数据库的连接并未关闭”,但事实上,数据库没有“第二次连接”.您正在使用单个连接,我猜这是在初始化程序(__init__)中为包含方法execute_query的未示出的示例类创建的.

您(再次猜测)在__init__方法中创建conn,但在执行任何查询后立即关闭它.因此,当您执行另一个查询时,它将不可用.

相反,您不应该在查询结束时使用.close()而是.commit().最后不要这样做,而是在尝试结束时.这样,事务将被提交(如果成功)或回滚(在except块中,如果失败).

然后,向更大的类添加一个单独的.close()方法,然后在连接上调用.close(),并让调用程序在完成所有查询时调用该方法.该关闭调用将适当地出现在较大程序内的finally块中.

总结

以上是内存溢出为你收集整理的sqlite3.ProgrammingError:无法在已关闭的数据库上运行. [Python] [sqlite]全部内容,希望文章能够帮你解决sqlite3.ProgrammingError:无法在已关闭的数据库上运行. [Python] [sqlite]所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1156040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存