这更像是一个理论上的问题,但我一直试图找到一个正确的答案几个小时,但我还没有找到解决方案。我有一个大烧瓶应用程序,它包含多个路线。
@app.route('/try'):
@app.route('/new'):
和其他许多人。我使用MySQLdb用于数据库目的。在我开始申请之前我已经有了这个。
import MySQLdb as mysql
db = mysql.connect('localhost', 'root', 'password', 'db')
cursor = db.cursor()
它工作正常,但一段时间后,它会在分配之前生成错误“局部变量'光标'。”这可能是由于mysql关闭连接一段时间后的原因。所以,我进入了 每个路由函数中的cursor = db.cursor()并关闭它,我完成了这样的处理:
db = mysql.connect('localhost', 'root', 'password', 'db')
@app.route('/')
def home():
cursor=db.cursor()
...some processing...
cursor.close()
return render_template('home.html')
@app.route('/new')
def home_new():
cursor=db.cursor()
...some processing...
cursor.close()
return render_template('homenew.html')
现在我想问一下这种做法是对的吗?我应该为每个请求定义一个游标并关闭它吗?
答案 0 :(得分:0)
这就是我设置MySQLdb的方法
def requestConnection():
"Create new connection. Return connection."
convt = cv.conversions.copy()
convt[3] = int
convt
conn = db.connect(host=c.SQL_HOST, port=c.SQL_PORT, user=c.SQL_USER, passwd=c.SQL_PASSWD, db=c.SQL_DB, conv=convt, use_unicode=True, charset="utf8")
return conn
def requestCursor(conn):
return conn.cursor(db.cursors.DictCursor)
然后,在每个SQL函数的开头我都这样做:
def executeQuery(query):
"Execute a given query. Used for debug purpouses."
conn = requestConnection()
cur = requestCursor(conn)
cur.execute(query)
r = cur.fetchall()
cur.close()
conn.close()
return r
我更改了转换,因为我必须将DB中的int值从Float更改为int,但是您可以跳过此步骤。
如果没有,您需要导入:
import MySQLdb as db # https://github.com/farcepest/MySQLdb1
import MySQLdb.converters as cv
希望它有所帮助!