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

Flask+Python更新MySQL最后一条记录时ProgrammingError报错排查

解决MySQL更新最后一条记录时的ProgrammingError问题

嘿,我来帮你搞定这个问题!你遇到的错误和两个小细节有关,咱们一步步捋清楚:

问题根源拆解

你碰到的MySQLdb._exceptions.ProgrammingError: not all arguments converted during bytes formatting错误,主要是这两个原因导致的:

  1. 参数传递格式不对:Python里给cursor.execute()传单个参数时,必须用元组形式,但你写的(first_name)只是普通变量,不是元组,数据库驱动没法正确解析。
  2. UPDATE子查询返回值不匹配:你原来的子查询SELECT * FROM names ORDER BY id DESC LIMIT 1返回的是整行数据,可WHERE id =需要的是单个id值,类型不匹配自然报错。

另外还有个小疏漏:你现在的代码是先查询再提交事务,这会导致查到的是更新前的旧数据,顺序得调整下。

修正后的完整代码

服务1的修正函数

@app.route("/edit_first_name", methods = ['GET','POST'])
def edit_first_name():
    if request.method == 'POST':
        """ Collect first name from service 4. Amend the first name of last entry in database and display entry in table. """
        updated_first_name = requests.get("http://service_4:5003/first_name")
        first_name = updated_first_name.text
        cur = mysql.connection.cursor()
        
        # 方案1:用ORDER BY获取最新记录的id(修正子查询为返回id)
        cur.execute('UPDATE names SET first_name = %s WHERE id = (SELECT id FROM names ORDER BY id DESC LIMIT 1)', (first_name,))
        
        # 方案2:用MAX(id)直接获取最大id(二选一即可)
        # cur.execute('UPDATE names SET first_name = %s WHERE id = (SELECT MAX(id) FROM names)', (first_name,))
        
        # 先提交更新,再查询最新数据
        mysql.connection.commit()
        
        cur.execute('SELECT * FROM names')
        rows = cur.fetchall()
        names = []
        for row in rows:
            names.append(row)
        
        cur.close()
        return render_template("layout.html", first_name = first_name, title = "Name Generator", names = names)

关键修正点说明

  • 参数格式修正:把(first_name)改成(first_name,),加个逗号就变成了单个元素的元组,数据库驱动就能正确识别参数了。
  • 子查询修正:要么把SELECT *改成SELECT id,让子查询返回单个id值;要么直接用SELECT MAX(id),逻辑更直白,两种方式都能定位到最新的那条记录。
  • 事务顺序调整:先执行commit()提交更新操作,再查询数据库,这样拿到的就是刚更新后的最新数据。

服务4的代码优化(可选)

你的服务4功能完全正常,只是可以把代码写得更简洁直观:

from flask import Flask, request
import random
app = Flask(__name__)

@app.route("/first_name", methods = ['GET'])
def first_name():
    first_names = [
        "Valeria","Perla", "Elisabeth", "Joanna", "Jordan",
        "Violet", "Conor", "Whitney", "Ethen", "Ronan", "Selina", "Simone"
    ]
    return random.choice(first_names)  # 用random.choice比randrange更易懂

if __name__ == "__main__":
    app.run(port = 5001, host = "0.0.0.0", debug = True)

内容的提问来源于stack exchange,提问作者Denzaaaaal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:53:14