使用pymysql查询数据库特定值,phpMyAdmin执行正常但Python返回0或None
问题解决方法
异常原因
- 直接拼接SQL语句存在语法风险:如果
name变量包含单引号、空格等特殊字符,会导致实际执行的SQL和你在phpMyAdmin中手动输入的SQL逻辑不一致,同时还有SQL注入隐患 - pymysql默认开启事务隔离:如果数据是近期写入还未提交,当前连接的查询会读不到未提交的数据,导致返回结果为空
LIKE关键字如果用于精确匹配,未加通配符也可能出现匹配逻辑偏差
修复代码示例
import pymysql # 建立连接部分保持你原有逻辑不变,仅修改查询相关代码 cur = conn.cursor() # 采用参数化查询,用%s作为占位符,不要直接拼接字符串 sql_search = 'SELECT * FROM accounts WHERE username LIKE %s' # execute方法第二个参数传入参数元组,pymysql会自动处理特殊字符转义 # 如果是精确匹配可以把LIKE换成=,性能更高;如果需要模糊匹配,参数加%:(f"%{name}%",) execute_res = cur.execute(sql_search, (name,)) # 手动提交事务,保证能读取到最新数据 conn.commit() query_res = cur.fetchone() if query_res: # 按索引取对应字段值转为字符串即可,比如第一个字段是id,第二个是username就取query_res[1] # 也可以初始化字典游标,直接按字段名取值:cur = conn.cursor(pymysql.cursors.DictCursor) # 字典游标模式下取值:target_str = str(query_res['username']) target_str = str(query_res[1]) print(target_str)
验证步骤
- 打印参数化查询最终执行的SQL确认逻辑匹配:可以通过
print(cur._last_executed)查看实际执行的SQL语句,和phpMyAdmin中执行的SQL做对比 - 确认
name变量的值和预期一致,没有多余的换行、空格等不可见字符
内容的提问来源于stack exchange,提问作者KernelPanic
相关产品推荐
相关产品推荐

