SQL日期插入异常:无1997日期值却触发Date_Issued字段错误
问题排查与解决
错误根源
你生成的SQL语句里,日期值没有被单引号包裹,MySQL会把2023-01-25当成算术表达式计算:2023 - 1 - 25 = 1997,这个数值无法转换为合法的DATE类型,所以触发了"Incorrect date value: '1997'"的错误。
看你调试器里的SQL:
INSERT INTO Librarian.Issues(Title, Date_Issued, Date_Due, Doc_id) VALUES("Return of the King",2023-01-25,2023-02-08, 3);
这里2023-01-25和2023-02-08没有引号,MySQL自动执行减法运算,得到的1997自然不符合DATE列的要求。
修复方案
方案1:给日期值添加单引号
修改SQL生成的代码,将issuedate和returndate用单引号包裹:
def insertIssue(self, choice, doc_id): date = datetime.today() + timedelta(days=14) returndate = str(date.strftime('%Y-%m-%d')) issuedate = str(datetime.today().strftime('%Y-%m-%d')) # 给日期值加上单引号 sql = dbcfg.sql['insertIssues'].replace('{_ttl}', f'"{choice[2]}"').replace('{_date}', f"'{issuedate}'").replace( '{_due}', f"'{returndate}'").replace("{_docid}", str(doc_id)) logger.info("Issues SQL Insert: " + sql) try: mycursor.execute(sql) # 插入操作不需要fetchall(),直接移除 # 提交事务确保数据写入 self._cnx.commit() except Exception as e: logger.error("Error in Issues SQL: " + str(e) + traceback.format_exc()) sys.exit(-1)
修改后生成的SQL会变成:
INSERT INTO Librarian.Issues(Title, Date_Issued, Date_Due, Doc_id) VALUES("Return of the King",'2023-01-25','2023-02-08', 3);
这样MySQL会正确识别日期字符串。
方案2:使用参数化查询(推荐)
字符串拼接/替换生成SQL存在SQL注入风险,也容易出现这类格式错误,更安全的方式是用参数化查询:
假设你的dbcfg.sql['insertIssues']定义为:
INSERT INTO Librarian.Issues(Title, Date_Issued, Date_Due, Doc_id) VALUES(%s, %s, %s, %s);
然后修改代码:
def insertIssue(self, choice, doc_id): date = datetime.today() + timedelta(days=14) returndate = str(date.strftime('%Y-%m-%d')) issuedate = str(datetime.today().strftime('%Y-%m-%d')) sql = dbcfg.sql['insertIssues'] # 使用参数化传递值 params = (choice[2], issuedate, returndate, doc_id) logger.info("Issues SQL Insert: " + sql + " | Params: " + str(params)) try: mycursor.execute(sql, params) self._cnx.commit() except Exception as e: logger.error("Error in Issues SQL: " + str(e) + traceback.format_exc()) sys.exit(-1)
参数化查询会自动处理字符串、日期等类型的格式问题,同时避免SQL注入。
额外注意点
- 插入操作执行后必须调用
commit()提交事务,否则数据不会写入数据库。 fetchall()用于查询操作获取结果,插入操作不需要调用,可直接移除。
内容的提问来源于stack exchange,提问作者R S
相关产品推荐
相关产品推荐

