Flask+Python更新MySQL最后一条记录时ProgrammingError报错排查
解决MySQL更新最后一条记录时的ProgrammingError问题
嘿,我来帮你搞定这个问题!你遇到的错误和两个小细节有关,咱们一步步捋清楚:
问题根源拆解
你碰到的MySQLdb._exceptions.ProgrammingError: not all arguments converted during bytes formatting错误,主要是这两个原因导致的:
- 参数传递格式不对:Python里给
cursor.execute()传单个参数时,必须用元组形式,但你写的(first_name)只是普通变量,不是元组,数据库驱动没法正确解析。 - 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
相关产品推荐
相关产品推荐

