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
相关产品推荐
相关产品推荐

