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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:14:50