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

时间:2014-04-13 17:21:07

标签: python sql python-2.7 sqlite

我正在使用一个通用函数来执行类中的所有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数据库一起使用时没有发生。这个问题的解决方案是什么?

3 个答案:

答案 0 :(得分:6)

你写"在我看来,在尝试第二次连接之前,没有关闭与数据库的连接"但事实上,没有第二个连接"到数据库。您正在使用单个连接,我猜测是在初始化程序(__init__)中为包含方法execute_query的未示例的类创建的

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

相反,您不应该在查询结束时.close()而是.commit()。不要在finally中执行此操作,而应在try的末尾执行此操作。这样,事务将被提交(如果成功)或回滚(在except块中,如果失败)。

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

答案 1 :(得分:1)

从代码中删除

 self.conn.close()

它将解决问题,因为当您想要从数据库中检索信息时,您无法编写

  

conn.close()

答案 2 :(得分:0)

为什么关闭连接的业务方法?当然应该关闭光标呢?关闭连接意味着第二次调用executeQuery时,它将失败,因为连接已经消失。