Python操作MySQL:如何正确使用字符串参数?代码执行报错求助
解决MySQL Connector表名字符串参数的语法错误
你的问题出在mysql.connector的参数化机制不支持替换表名这类SQL标识符——cur.execute()的%s占位符仅用于处理SQL语句中的值(比如WHERE条件里的数值/字符串),不能用来替换表名、列名。直接用它替换表名会被驱动解析成带引号的字符串,导致SQL语法错误。
修正后的代码
import mysql.connector as mc con = mc.connect(user='root', host='localhost', password='something', database='something') cur = con.cursor() def getItem(ID, course): # 先校验course的合法性,防止SQL注入 allowed_course_suffixes = ['Entree', 'Dessert', 'Drink'] # 根据你的实际表结构调整 if course not in allowed_course_suffixes: raise ValueError("Invalid course type") # 安全拼接表名 table_name = f"Menu{course}" # ID用参数化占位符,表名直接拼入SQL cur.execute(f"SELECT Item FROM {table_name} WHERE ID = %s", (ID,)) return cur.fetchone()
关键要点
- 表名不能参数化:SQL标识符(表名、列名)无法通过
execute()的参数替换,必须直接拼入语句。但必须通过白名单校验course参数,避免恶意输入引发SQL注入。 - 值必须参数化:WHERE子句中的
ID一定要用%s占位符,将值作为参数传入,这是安全处理用户输入的标准方式。 - 冗余语法清理:原代码中
ID = (%s)的括号无意义,移除后更符合SQL规范。
内容的提问来源于stack exchange,提问作者Zayan Anwar
相关产品推荐
相关产品推荐

