关闭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条答案
按热度按时间daupos2t1#
一个原因是cur.fetchall()可能会返回一个迭代器,如果在关闭游标之前迭代器没有完全处理,那么可能会导致问题。在sqlalchemy中,似乎是这样的,因为fetchall实际上似乎返回一个迭代器(根据docs)。
所以你可以做得更好:
这将确保在关闭游标之前迭代器已用完。
只有在处理非常大的数据库的情况下,才能更好地使用它(为列表节省空间——但无论如何渲染结果很可能非常大):
回到你原来的问题:是的,原来的代码是完全错误的,因为当方法在返回之前被留下时,结束永远不会到达。我的意图可能是我上面所描述的,但这是不对的。