Dom*_*icM 7 python sql sqlite python-2.7
我正在使用一个通用函数来执行类中的所有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
Run Code Online (Sandbox Code Playgroud)
这是让我得到数据库关闭错误的循环:
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
Run Code Online (Sandbox Code Playgroud)
错误似乎源于getStageAdditives()它返回4项,而getStageByDate()返回只有1.
在我看来,在尝试第二次连接之前,没有关闭与数据库的连接.为什么会这样?与MySQL数据库一起使用时没有发生.这个问题的解决方案是什么?
您写道"在我看来,在尝试第二次连接之前,数据库的连接并未关闭",但事实上,数据库没有"第二次连接".您正在使用单个连接,我猜这是在初始化程序(__init__)中为包含该方法的示例中未示出的类创建的execute_query.
您(再次猜测)conn在该__init__方法中创建,但在执行任何查询后立即关闭它.因此,当您执行另一个查询时,它将不可用.
相反,您不应该.close(),而是.commit()在查询结束时.不要这样做,finally而是在结束时try.这样,事务将被提交(如果成功)或回滚(在except块中,如果失败).
然后,.close()向更大的类添加一个单独的方法,然后调用.close()连接,并让调用程序在完成所有查询时调用该方法.该关闭调用将适当地出现在finally较大程序内的块中.