You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:30:50