使用Python向MySQL插入数据时遇字符串格式化参数转换错误
解决MySQLdb的ProgrammingError: not all arguments converted during string formatting
嘿,这个错误我太熟了!本质就是你在执行SQL插入时,占位符和传入的参数不匹配导致的,下面给你拆解常见问题和解决办法:
最常见的两个坑
1. 用错了占位符
MySQLdb只认%s作为参数占位符,别用其他库常用的?或者{}。比如你要是写了:
# 错误示例:用了?占位符 sql = "INSERT INTO users (name, email) VALUES (?, ?)"
赶紧改成%s:
# 正确写法 sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
2. 参数传递方式不对
执行execute()时,第二个参数必须是元组(或列表),哪怕只有一个参数也要注意格式:
- 错误示例1:参数数量和占位符不匹配
sql = "INSERT INTO users (name, email) VALUES (%s, %s)" cursor.execute(sql, ("Alice")) # 只有一个参数,少了email
- 错误示例2:单个参数没加逗号(会被当成字符串而非元组)
sql = "INSERT INTO users (name) VALUES (%s)" cursor.execute(sql, ("Alice")) # 这里("Alice")是字符串,不是元组!
- 正确写法:
# 多个参数:元组形式 cursor.execute(sql, ("Alice", "alice@example.com")) # 单个参数:加逗号变成元组 cursor.execute(sql, ("Alice",))
完整的正确示例
给你写个能跑的完整代码参考:
import MySQLdb # 连接数据库 db = MySQLdb.connect( host="localhost", user="your_username", passwd="your_password", db="your_database" ) cursor = db.cursor() # 定义SQL和参数 insert_sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)" user_data = ("Bob", 30, "bob@example.com") # 执行插入并提交 cursor.execute(insert_sql, user_data) db.commit() # 别忘了提交事务! # 关闭连接 cursor.close() db.close()
额外提醒
千万不要用字符串格式化把参数直接拼进SQL里(比如sql % user_data),不仅会触发这个错误,还会导致SQL注入漏洞,一定要用execute()的第二个参数传参!
内容的提问来源于stack exchange,提问作者Luca Squadrone
相关产品推荐
相关产品推荐

