You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mysql.connector参数化INSERT语句执行后数据库插入%s而非实际值的问题排查

解决MySQL参数化查询插入%s而非实际值的问题

我来帮你排查这个问题——你已经走在了正确的路上(改用参数化查询避免SQL注入),只是在两个细节上踩了坑:

问题根源

  1. SQL语句的多余嵌套括号:你写的VALUES (("%s"))多了一层括号,虽然语法上没问题,但会干扰驱动对占位符的解析;
  2. 参数未正确构造为元组:单个值的参数如果写成(tweet_values["created_at"]),Python会把它当成普通的单个值而非元组传递,导致驱动无法识别这是要替换占位符的参数,最终直接把%s插入了数据库。

正确的参数化查询写法

先修正SQL语句,去掉多余的括号,然后确保参数是带逗号的元组(单个元素的元组必须加逗号,这是Python的语法特性):

# 修正后的SQL语句,去掉多余括号
query = """INSERT IGNORE INTO analysing_tweet(created_at) VALUES (%s)"""
# 单个值的参数要写成带逗号的元组
values = (tweet_values["created_at"],)
cursor.execute(query, values)

或者更简洁的写法,直接在execute里传递参数:

cursor.execute("""INSERT IGNORE INTO analysing_tweet(created_at) VALUES (%s)""", 
               (tweet_values["created_at"],))

额外说明

针对你使用的版本(MySQL 8.0.25、Python 3.8.10、mysql-connector-python 8.0.25):

  • mysql-connector-python(8.x版本)确实使用%s作为参数化查询的占位符(和一些其他数据库驱动用?不同),所以占位符本身是正确的;
  • 一定要避免回到字符串格式化的写法,那会带来严重的SQL注入风险,参数化查询才是安全的正确做法。

内容的提问来源于stack exchange,提问作者Fake Disciple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:27:49