mysql.connector参数化INSERT语句执行后数据库插入%s而非实际值的问题排查
解决MySQL参数化查询插入
%s而非实际值的问题 我来帮你排查这个问题——你已经走在了正确的路上(改用参数化查询避免SQL注入),只是在两个细节上踩了坑:
问题根源
- SQL语句的多余嵌套括号:你写的
VALUES (("%s"))多了一层括号,虽然语法上没问题,但会干扰驱动对占位符的解析; - 参数未正确构造为元组:单个值的参数如果写成
(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
相关产品推荐
相关产品推荐

