Python MySQL SELECT语句执行报错求助:语法错误排查
问题原因与解决方案
你的问题出在MySQL参数化查询的占位符用途限制:%s只能用来替换SQL语句中的值,不能替换表名、列名这类数据库标识符。当你用%s替换表名时,驱动会自动给表名加上引号,导致SQL变成类似SELECT close FROM 'xxx_ivol' WHERE date = 'xxxx-xx-xx',而表名是不需要加引号的,这就触发了语法错误。
修正代码
d2 = df.iloc[-1,:] q = symbol+'_ivol' # 先通过字符串格式化处理表名(确保symbol是可信的,避免SQL注入) query = f"""SELECT close FROM `{q}` WHERE date = %s""" # 只把日期值作为参数传入 VALUES = (d2[1],) cursor.execute(query, VALUES) ivol = cursor.fetchall() conn.close()
关键注意事项
- 表名用反引号(
)包裹是为了避免表名和MySQL关键字冲突,比如如果表名是order`这类关键字,必须加反引号。 - 用字符串拼接表名存在SQL注入风险,所以一定要确保
symbol是你自己程序可控的(比如来自固定配置、白名单,而不是用户输入),如果是用户输入的内容,必须做严格的合法性校验。
内容的提问来源于stack exchange,提问作者BTT
相关产品推荐
相关产品推荐

