Flask API中SELECT查询无法获取数据库更新后的数据问题求助
问题解决:Flask API查询数据库返回旧数据
问题根源
你遇到的情况是因为数据库连接的事务隔离机制导致的:如果你的conn是全局复用的连接,数据库默认会开启事务,手动修改数据库的操作属于外部事务提交,而API的连接未提交自身事务,会一直读取事务启动时的数据快照,只有重启API重建连接才能获取新数据。另外你的代码还存在SQL注入风险,顺便一起修复。
解决方案
方案1:每次请求创建新连接(推荐)
避免全局复用连接,每次请求时建立新连接,用完即关闭,确保每次查询都读取最新数据:
def checkAuth(): # 替换成你的数据库连接创建逻辑,比如MySQL连接 conn = mysql.connector.connect( host="your_host", user="your_user", password="your_pwd", database="your_db" ) cursor = conn.cursor() data = request.get_json() email = data['email'] passw = data['passw'] # 参数化查询,彻底避免SQL注入 query = "SELECT COUNT(id), email, passw, stat FROM users WHERE email = %s AND passw = %s" cursor.execute(query, (email, passw)) res = cursor.fetchone() cursor.close() conn.close() # 关闭连接 if not res or res[0] < 1: return "Error" return jsonify(res)
方案2:开启全局连接自动提交
如果必须复用全局连接,初始化连接时开启自动提交,让每次查询都读取最新数据:
# 全局连接初始化时开启自动提交 conn = mysql.connector.connect( host="your_host", user="your_user", password="your_pwd", database="your_db" ) conn.autocommit = True # 关键设置 def checkAuth(): cursor = conn.cursor() data = request.get_json() email = data['email'] passw = data['passw'] query = "SELECT COUNT(id), email, passw, stat FROM users WHERE email = %s AND passw = %s" cursor.execute(query, (email, passw)) res = cursor.fetchone() cursor.close() if not res or res[0] < 1: return "Error" return jsonify(res)
关键说明
- 数据库事务默认处于开启状态,未提交的连接会维持数据快照,无法看到外部事务的修改;
- 永远不要用字符串拼接SQL,参数化查询是防止SQL注入的标准做法;
内容的提问来源于stack exchange,提问作者Antharaz
相关产品推荐
相关产品推荐

