【问题标题】:MySQLdb returning old data when used with Flask PostMySQLdb 在与 Flask Post 一起使用时返回旧数据
【发布时间】:2017-08-06 21:31:33
【问题描述】:

我有一个带有MySQL 后端的Flask 网站。我有一个名为 users 的表。它有两列:用户名和名称以及一条记录:

name  username
Jim   testuser123

当用户点击网站上的按钮时,它会更新记录以将名称设置为Bob,然后打印name = 'Bob' 所在的所有记录。然而,它没有返回任何结果。如果我在重新查询之前刷新连接,那么它确实会返回一个结果。 mdb.connect 对象是否缓存数据?怎么可能不返回正确的结果?

初始化.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() 之后,但在print 语句之前添加con=sql_con()。这是为什么呢?

【问题讨论】:

标签: python mysql python-2.7 mysql-python


【解决方案1】:

一般来说,将 ORM 绑定(即 Falsk-SQLAlchemy)与 Web 框架(管理连接池、自动提交/回滚等)一起使用是一种很好的做法,即使 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 请求上)可能会耗费大量时间。

【讨论】:

  • 我在谈论 ORM 绑定(对象关系映射器)来代替代码中的低级绑定。谷歌“flask sqlalchemy”获取示例。这样的 ORM 负责将 Web 事务与 DB 事务同步、连接池管理、sql 注入过滤、sql 引用、对象 db 行自动转换,...​​
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多