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

Python向MySQL插入数据遇问题,请求技术协助

咱们来一步步拆解你遇到的问题,再给你一个稳当的解决方案:

第一种方法的问题

  • 你把SQL语句和参数打包成了一个tuple直接传给execute(),但execute()要求第一个参数是纯SQL字符串,第二个参数单独传参数元组,不能把两者混在一起当一个参数传,这才触发了'tuple' object has no attribute 'encode'的错误。
  • MySQL的Python连接器(mysql-connector-python)统一用%s作为占位符,不管字段是数字、字符串还是日期,不需要用%d,你还把%s写成了$s,这也是语法错误。

第二种方法的问题

  • MySQL Connector/Python不支持用?做占位符,它只认%s,这是和其他数据库驱动(比如SQLite)不一样的地方。
  • 你的SQL语句里VALUES(?,?,?,?,?,?,?,)最后多了一个逗号,导致占位符数量变成了8个,但你只传了7个参数,这就是报错Not all parameters were used in the SQL statement的核心原因。

正确的插入方案

下面是标准且安全的Python向MySQL插入数据的写法,我帮你修正了所有问题:

import mysql.connector

# 先建立数据库连接,替换成你的实际配置
mydb = mysql.connector.connect(
  host="localhost",  # 你的数据库主机地址
  user="your_username",
  password="your_password",
  database="your_db_name"
)

mycursor = mydb.cursor()

# 所有占位符统一用%s,字段顺序和参数顺序严格对应
sql = '''INSERT INTO lgemployees (EmpID, Name, Gender, DOB, Address, PhoneNumber, Email)
         VALUES (%s, %s, %s, %s, %s, %s, %s)'''
# 参数元组的数量要和字段/占位符数量完全一致
val = (eid, name, gen, dob, add, mob, email)

# 注意:execute要分开传SQL字符串和参数元组
mycursor.execute(sql, val)
# 一定要提交事务,不然数据不会写入数据库
mydb.commit()

print(f"{mycursor.rowcount} 条员工记录已成功插入")

额外提醒

  • 如果你的DOB字段是MySQL的DATE类型,要确保传入的dob变量是Python的datetime.date对象,或者格式为'YYYY-MM-DD'的字符串,不然会插入失败。
  • 永远用参数化查询(像上面这样用占位符),不要直接把变量拼进SQL字符串里,这能有效防止SQL注入攻击。

内容的提问来源于stack exchange,提问作者Brite Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:19:08