使用pyodbc向SQL Server插入datetime对象时报'2021'附近语法错误(102)
错误根因
- 直接通过F字符串将Python datetime对象拼接进SQL语句时,Python默认转换出的日期字符串格式不符合SQL Server datetime2类型的语法规范,因此触发
2021附近语法错误的提示 - 字符串拼接SQL本身属于不安全的写法,存在SQL注入的安全隐患
修复方案
方案1:使用参数化查询(最推荐)
参数化查询会自动完成Python datetime类型到SQL Server datetime2类型的格式映射,无需手动处理日期格式,同时规避SQL注入风险:
import datetime creationdatetime = datetime.datetime.now() # 使用?作为参数占位符,不要直接拼接数值 sql = "INSERT INTO [SCHEMA].[TABLE] ([CreationDateTime]) VALUES (?)" # 将参数以元组形式传入execute方法的第二个参数 cursor.execute(sql, (creationdatetime,)) cursor.commit()
方案2:手动转换为兼容的日期格式(不推荐,仅做参考)
如果特殊场景需要手动拼接SQL,需将datetime转换为SQL Server可识别的ISO 8601标准格式:
import datetime creationdatetime = datetime.datetime.now() # 转换为ISO 8601标准格式,避免语言/区域设置导致的格式不兼容问题 dt_compatible_str = creationdatetime.isoformat() sql = f"INSERT INTO [SCHEMA].[TABLE] ([CreationDateTime]) VALUES ('{dt_compatible_str}')" cursor.execute(sql) cursor.commit()
内容的提问来源于stack exchange,提问作者Anouar
相关产品推荐
相关产品推荐

