数据库未更新求助:执行SQL无报错但Status字段未变更
数据库UPDATE语句执行后无报错但未更新数据的排查与解决
以下是针对问题的具体排查方向和解决办法:
检查WHERE条件的匹配逻辑
你的代码用f-string拼接SQL时,telgramname的条件未添加单引号。如果tgname是字符串类型,生成的SQL会因语法错误无法匹配目标数据(比如生成WHERE telgramname = test_user而非正确的WHERE telgramname = 'test_user')。即便程序无报错,也会因条件不匹配导致0行数据被更新。查看受影响行数确认匹配情况
在执行crsr.execute(upp1)后添加代码,查看实际更新的行数:print(crsr.rowcount) # 输出受影响行数,若为0则说明无匹配数据行如果输出为0,需核对
tgname的值与数据库中telgramname列的内容是否完全一致,注意大小写、空格、特殊字符等细节。改用参数化查询规避语法与注入风险
直接用f-string拼接SQL存在SQL注入风险,且易因字符串转义出错。替换为参数化查询,让驱动自动处理数据格式:conn = mysql.connector.connect( host=HOSTNAME, user=USERNAME, passwd=PASSWORD, database=DATABASE ) crsr = conn.cursor() # 使用%s作为占位符,参数以元组形式传入 upp1 = "UPDATE `ord` SET `Status` = %s WHERE `ord`.`telgramname` = %s" crsr.execute(upp1, (newstatus, tgname)) print(f"更新了{crsr.rowcount}行数据") conn.commit() crsr.close() conn.close() bot.send_message(message.chat.id, 'Статус обнавлен')核对数据库与表结构正确性
确认连接的数据库(DATABASE参数)、表名ord、列名telgramname(注意是否拼写错误,比如应为telegramname)、Status是否与实际数据库结构一致,部分数据库对表名/列名的大小写敏感。验证事务提交状态
虽然代码中调用了conn.commit(),可在提交后检查连接状态,或临时开启自动提交测试(不建议生产环境使用):conn.autocommit = True # 在connect之后设置
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

