在Flask中使用mysqldb游标
这其实是个理论性的问题,我花了好几个小时想找到正确的答案,但到现在还没找到解决办法。我有一个很大的Flask应用程序,里面有很多路由。
@app.route('/try'):
@app.route('/new'):
还有很多其他的路由。我使用MySQLdb来处理数据库。在应用程序开始的时候,我是这样做的。
import MySQLdb as mysql
db = mysql.connect('localhost', 'root', 'password', 'db')
cursor = db.cursor()
这样运行得很好,但过了一段时间后,出现了一个错误:“局部变量'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')
现在我想问,这样做对吗?我应该为每个请求都定义一个游标并在处理完后关闭它吗?
1 个回答
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
我更改了转换方式,因为我需要把数据库中的浮点数改成整数,这个是因为我的工作需要,但你可以跳过这一步。
如果不跳过,你需要导入这个:
import MySQLdb as db # https://github.com/farcepest/MySQLdb1
import MySQLdb.converters as cv
希望这对你有帮助!