我怀疑您正在视图之外构建PreparedStatement对象并将其作为全局访问。在
您需要知道django没有连接池的概念,并且每个页面视图都使用一个全新的数据库连接。MySQL准备的语句只在定义它们的连接/会话的生命周期内存在。因此,第一个pagview加载PreparedStatement所在的模块,并将其放入数据库,但第二个连接尝试执行在前一个连接中准备好的语句,但显然失败了。在
要解决这个问题,请在需要它的视图中创建PreparedStatement,或者使用类似这样的方法(更像pythonical,而不是模仿PHP):class PreparedStatement(object):
def __init__(self, name, query, vars):
self.name = name
self.query = query
self.vars = vars
def prepare(self):
SQL = "PREPARE %s FROM " % self.name
self.__executeQuery(SQL + " %s ;", self.query)
def get_prepared(self):
# store a map of all prepared queries on the current connection
return getattr(connection, "__prepared", default={})
def execute(self, **kwvars):
if not self.name in self.get_prepared().keys()
# Statement will be prepared once per session.
self.prepare()
SQL = "EXECUTE %s " % self.name
if self.vars:
missing_vars = set(self.vars) - set(kwvars)
if missing_vars:
raise TypeError("Prepared Statement %s requires variables: %s" % (
self.name, ", ".join(missing_variables) ) )
param_list = [ var + "=%s" for var in self.vars ]
param_vals = [ kwvars[var] for var in self.vars ]
SQL += "USING " + ", ".join( param_list )
return self.__executeQuery(SQL, *param_vals)
else:
return self.__executeQuery(SQL)
def __executeQuery(self,query, *args):
cursor = connection.cursor()
if args:
cursor.execute(query,args)
else:
cursor.execute(query)
return cursor
像这样使用它
^{pr2}$
免责声明:我没有测试这个,但它应该运行或是足够容易调整运行。在