在Flask中使用mysqldb游标

2 投票
1 回答
7811 浏览
提问于 2025-04-18 14:35

这其实是个理论性的问题,我花了好几个小时想找到正确的答案,但到现在还没找到解决办法。我有一个很大的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

希望这对你有帮助!

撰写回答