Python中MySQL INSERT语句执行失败,datetime值错误求助
解决pymysql插入datetime时的1292错误
嘿,这个错误我太熟了!你遇到的pymysql.err.InternalError: (1292, "Incorrect datetime value: 'row[3]' for column 'date_added' at row 1"),核心问题很简单:你把Python变量row[3]当成字符串硬写到SQL语句里了,数据库收到的不是你CSV里的实际日期值,而是字符串'row[3]',这肯定不符合date_added字段的datetime格式要求啊!
错误原因拆解
从你的代码片段推测,你原来构造SQL的方式大概是这样的:
sql = "INSERT INTO articles2 (xxx, date_added) VALUES ('xxx', 'row[3]')"
这里的'row[3]'是直接作为固定字符串传入SQL的,数据库根本不知道这是Python里的变量,只会把它当成一个完全无效的日期字符串处理,自然就触发1292错误了。
正确的解决方法:用参数化查询
pymysql支持参数化查询,既可以避免SQL注入风险,还能自动处理数据类型匹配问题。修改你的代码如下:
import csv import pymysql def insert_articles2(rows): rowcount = 0 # 假设你已经完成数据库连接的建立(conn = pymysql.connect(...)) cursor = conn.cursor() for row in rows: if rowcount != 0: # 跳过CSV的表头行 # 用%s作为占位符,注意不要给占位符加引号 sql = "INSERT INTO articles2 (col1, col2, date_added) VALUES (%s, %s, %s)" # 把row中对应位置的值作为参数元组传给execute方法 cursor.execute(sql, (row[0], row[1], row[3])) rowcount += 1 conn.commit() # 记得提交事务 cursor.close() conn.close()
额外注意事项
- 确保CSV中
row[3]的日期格式是MySQL认可的标准格式,比如'YYYY-MM-DD'或者'YYYY-MM-DD HH:MM:SS'。如果CSV里的日期格式不匹配,需要先在Python中转换:from datetime import datetime # 假设CSV里的日期是'2023/10/05'格式,转成MySQL支持的格式 formatted_date = datetime.strptime(row[3], '%Y/%m/%d').strftime('%Y-%m-%d') # 再把formatted_date作为参数传入execute - 永远不要用字符串拼接的方式构造SQL语句,除了数据类型问题,还会带来严重的SQL注入漏洞。
内容的提问来源于stack exchange,提问作者Deba
相关产品推荐
相关产品推荐

