Python使用mysqlclient的MySQLdb插入datetime报1292错误咨询
解决MySQLdb插入
2018-03-25 02:00:02时的OperationalError(1292)错误 嘿,这个问题我之前也碰到过!核心原因是你要插入的2018-03-25 02:00:02是个不存在的无效时间——大部分欧洲时区(比如CET/CEST)会在每年3月最后一个周日的凌晨2点把时钟拨快1小时到3点,所以这个时间点根本就不会出现,MySQL自然会拒绝这种非法的datetime值。
下面给你几个可行的解决方案:
方案一:修正数据源的时间值
如果这个时间是从外部接口、日志或其他数据源获取的,大概率是数据源本身没处理好夏令时切换的问题。你可以把这个无效时间手动调整为合法值,比如2018-03-25 03:00:02(夏令时切换后的时间)或者2018-03-25 01:59:59(切换前的最后一秒),确保后续插入的时间都是时区中真实存在的点。方案二:调整数据库或连接的时区
如果你业务上不需要夏令时的处理,可以把MySQL服务器的时区改成UTC(无夏令时的标准时区):-- 全局生效(需要重启MySQL才能完全生效) SET GLOBAL time_zone = '+00:00'; -- 当前会话生效 SET time_zone = '+00:00';或者在Python建立数据库连接时直接指定时区参数,这样所有时间都会以UTC处理:
conn = MySQLdb.connect( host='你的数据库地址', user='用户名', passwd='密码', db='数据库名', use_unicode=True, charset='utf8', time_zone='+00:00' )注意:修改时区可能会影响现有数据的时间显示,操作前一定要确认业务需求哦。
方案三:在Python中预处理无效时间
如果你没法修改数据源或数据库时区,可以用pytz库在代码里检测并修正这类无效时间:import pytz from datetime import datetime # 替换成你的数据库使用的时区 target_timezone = pytz.timezone('Europe/Paris') original_dt = row['start'] # 也就是那个2018-03-25 02:00:02的datetime对象 try: # 尝试本地化时间,is_dst=None会严格检查时间是否存在 valid_dt = target_timezone.localize(original_dt, is_dst=None) except pytz.NonExistentTimeError: # 遇到无效时间就自动调整为夏令时后的时间 valid_dt = target_timezone.localize( datetime(original_dt.year, original_dt.month, original_dt.day, 3, 0, 0), is_dst=True ) # 之后用valid_dt代替原来的row['start']执行插入 conn.cursor.execute(query.format(table=table), (row['id'], row['type'], valid_dt, row['end'], row['raw_xml'], row['id_parent'], row['rango']))
你还可以先在MySQL命令行里测试插入这个时间,确认是否会报错,这样就能100%确认是夏令时的问题:
INSERT INTO 你的表名 (start) VALUES ('2018-03-25 02:00:02');
内容的提问来源于stack exchange,提问作者Géminis
相关产品推荐
相关产品推荐

