与 Flask 一起使用时 MySQLdb 返回旧数据 Post
MySQLdb returning old data when used with Flask Post
我有一个带有 MySQL
后端的 Flask
网站。我有一个 table 叫,用户。它有两列:用户名和姓名以及一条记录:
name username
Jim testuser123
当用户单击网站上的按钮时,它会更新记录以将名称设置为 Bob
,然后打印 name = 'Bob'
处的所有记录。然而,它 return 没有结果。如果我在重新查询之前刷新连接,那么它会按预期执行 return 一个结果。 mdb.connect
对象是否缓存数据?怎么可能 return 没有得到正确的结果?
初始化.py:
import pandas as pd
import MySQLdb as mdb
from flask import Flask, render_template, request
def sql_con():
return mdb.connect(host='myhost', port=3306, user='root', passwd='root', db='db', use_unicode=True, charset="utf8")
app = Flask(__name__)
def update_record():
con = sql_con()
cur = con.cursor()
sql_string= "Update users set name = 'Bob' where username = 'testuser123'"
cur.execute(sql_string)
con.commit()
@app.route('/', methods=['GET', 'POST'])
def myroute():
con = sql_con()
if request.method == 'POST':
update_record()
print pd.read_sql("select * from users where name = 'Bob'", con=con)
return render_template('1.html')
app.run( debug=True, port=5050)
1.html
<html>
<body>
<form method="POST">
<button id="mybutton" name='btn' value="mybutton">Submit Data</button>
</form>
</body>
为了让此代码打印一个结果,我必须在调用 update()
之后立即添加 con=sql_con()
,但在 print
语句之前。这是为什么?
一般来说,将 ORM 绑定(即 Falsk-SQLAlchemy)与 Web 框架(管理连接池、自动化 commit/rollback、...)结合使用是一种很好的做法,即使 ORM 对于简单的应用程序。
否则,如果您更喜欢在低级别(数据库连接)进行管理,请避免在同一请求中使用多个连接到同一数据库。
试试这个:
import pandas as pd
import MySQLdb as mdb
from flask import Flask, render_template, request
def sql_con():
return mdb.connect(host='myhost', port=3306, user='root', passwd='root', db='db', use_unicode=True, charset="utf8")
app = Flask(__name__)
def update_record(con):
cur = con.cursor()
sql_string= "Update users set name = 'Bob' where username = 'testuser123'"
cur.execute(sql_string)
con.commit()
@app.route('/', methods=['GET', 'POST'])
def myroute():
con = sql_con()
if request.method == 'POST':
update_record(con)
print pd.read_sql("select * from users where name = 'Bob'", con=con)
return render_template('1.html')
app.run( debug=True, port=5050)
如果你想基于这样的解决方案扩展一个真正的应用程序,你应该考虑从全局连接池中拉出一个打开的连接。创建新的数据库连接(在每个 HTTP 请求时)可能很耗时。
我有一个带有 MySQL
后端的 Flask
网站。我有一个 table 叫,用户。它有两列:用户名和姓名以及一条记录:
name username
Jim testuser123
当用户单击网站上的按钮时,它会更新记录以将名称设置为 Bob
,然后打印 name = 'Bob'
处的所有记录。然而,它 return 没有结果。如果我在重新查询之前刷新连接,那么它会按预期执行 return 一个结果。 mdb.connect
对象是否缓存数据?怎么可能 return 没有得到正确的结果?
初始化.py:
import pandas as pd
import MySQLdb as mdb
from flask import Flask, render_template, request
def sql_con():
return mdb.connect(host='myhost', port=3306, user='root', passwd='root', db='db', use_unicode=True, charset="utf8")
app = Flask(__name__)
def update_record():
con = sql_con()
cur = con.cursor()
sql_string= "Update users set name = 'Bob' where username = 'testuser123'"
cur.execute(sql_string)
con.commit()
@app.route('/', methods=['GET', 'POST'])
def myroute():
con = sql_con()
if request.method == 'POST':
update_record()
print pd.read_sql("select * from users where name = 'Bob'", con=con)
return render_template('1.html')
app.run( debug=True, port=5050)
1.html
<html>
<body>
<form method="POST">
<button id="mybutton" name='btn' value="mybutton">Submit Data</button>
</form>
</body>
为了让此代码打印一个结果,我必须在调用 update()
之后立即添加 con=sql_con()
,但在 print
语句之前。这是为什么?
一般来说,将 ORM 绑定(即 Falsk-SQLAlchemy)与 Web 框架(管理连接池、自动化 commit/rollback、...)结合使用是一种很好的做法,即使 ORM 对于简单的应用程序。
否则,如果您更喜欢在低级别(数据库连接)进行管理,请避免在同一请求中使用多个连接到同一数据库。
试试这个:
import pandas as pd
import MySQLdb as mdb
from flask import Flask, render_template, request
def sql_con():
return mdb.connect(host='myhost', port=3306, user='root', passwd='root', db='db', use_unicode=True, charset="utf8")
app = Flask(__name__)
def update_record(con):
cur = con.cursor()
sql_string= "Update users set name = 'Bob' where username = 'testuser123'"
cur.execute(sql_string)
con.commit()
@app.route('/', methods=['GET', 'POST'])
def myroute():
con = sql_con()
if request.method == 'POST':
update_record(con)
print pd.read_sql("select * from users where name = 'Bob'", con=con)
return render_template('1.html')
app.run( debug=True, port=5050)
如果你想基于这样的解决方案扩展一个真正的应用程序,你应该考虑从全局连接池中拉出一个打开的连接。创建新的数据库连接(在每个 HTTP 请求时)可能很耗时。