flask-何时关闭mysql连接?

时间:2018-08-11 14:36:34

标签: python mysql flask

关闭与mysql的连接的正确方法是什么?在我关注的教程中,作者使用第一种方法关闭了连接,但这似乎并不正确。因为它会在返回后尝试关闭。那么以下哪一项是正确的结账?

第一种方式,作者的方式:

@app.route("/dashboard")
@login_required
def dashboard():
    cur = mysql.connection.cursor()
    result = cur.execute("SELECT * FROM articles")

    articles = cur.fetchall()

    if result > 0:
        return render_template("dashboard.html", articles = articles)
    else:
        msg = "No Articles Yet"
        return render_template("dashboard.html", msg = msg)
    cur.close() // wrong

我的建议,我认为正确的方式:

@app.route("/dashboard")
@login_required
def dashboard():
    cur = mysql.connection.cursor()
    result = cur.execute("SELECT * FROM articles")

    articles = cur.fetchall()
    cur.close() // correct

    if result > 0:
        return render_template("dashboard.html", articles = articles)
    else:
        msg = "No Articles Yet"
        return render_template("dashboard.html", msg = msg)

1 个答案:

答案 0 :(得分:1)

一个可能导致cur.fetchall()返回的原因可能是未将游标关闭 一个迭代器,如果在关闭游标之前未完全处理迭代器,可能会引起麻烦。在SQLAlchemy中,似乎是这种情况,因为fetchall确实似乎返回了迭代器(根据docs)。

因此,您可以做得更好:

articles = list(cur.fetchall())
cur.close()

这将确保在关闭游标之前迭代器已耗尽。

仅在处理非常大的数据库的情况下,您才能对此做得更好(为列表节省空间-但无论如何,渲染结果都将非常大):

articles = cur.fetchall()
cur.close()

if result > 0:
   value = render_template("dashboard.html", articles = articles)
   cur.close()
   return value
else:
   cur.close()
   msg = "No Articles Yet"
   return render_template("dashboard.html", msg = msg)

回到您的原始问题:是的,原始代码是完全错误的,因为当方法之前留有return时,将永远无法实现关闭。目的可能是我上面所描述的,但这是不对的。