Python cx_Oracle按dd-mm-yyyy hh:mm:ss更新Oracle表日期报ORA-00933解决
报错根因
- 你当前代码直接把Python
datetime对象转成字符串拼到SQL语句里,一方面生成的日期字符串格式不符合Oracle默认的日期解析规则,另一方面硬拼值的写法很容易因为值的特殊字符破坏SQL语法结构,最终触发ORA-00933: SQL command not properly ended的语法类报错。 - Oracle的
DATE类型为二进制存储结构,本身不绑定显示格式,你需要的dd-mm-yyyy hh:mm:ss是日期值的格式要求,不需要把值当字符串存入字段。 - 直接硬拼SQL值的写法本身存在SQL注入风险,cx_Oracle原生支持参数绑定能力,完全不需要硬拼业务值。
正确实现方式
方案1:依赖驱动自动类型映射(最稳定)
cx_Oracle会自动把传入的Python datetime对象映射为Oracle的DATE类型,不需要手动转字符串,是最推荐的写法:
import cx_Oracle import datetime # 替换为你现有的连接、游标初始化逻辑 connection = cx_Oracle.connect("用户名/密码@数据库地址:端口/服务名") cursor = connection.cursor() sql = """ UPDATE a_table SET COMPLETION_DATE = :target_completion_dt WHERE ID = :target_id """ # 通过参数绑定传值,不要硬拼进SQL字符串 cursor.execute( sql, target_completion_dt=datetime.datetime.now(), # 自动保留到秒级精度,完全匹配格式要求 target_id=1 ) connection.commit() # 必须手动提交,cx_Oracle默认关闭自动提交
方案2:SQL层显式做格式转换(匹配自定义格式要求)
如果需要在SQL层严格按照dd-mm-yyyy hh:mm:ss的规则做日期解析,可以借助Oracle内置的TO_DATE函数完成类型转换:
sql = """ UPDATE a_table SET COMPLETION_DATE = TO_DATE(:dt_string, 'dd-mm-yyyy hh24:mi:ss') WHERE ID = :target_id """ # 提前把Python当前时间按要求格式转成字符串,通过参数传入 current_dt_string = datetime.datetime.now().strftime('%d-%m-%Y %H:%M:%S') cursor.execute( sql, dt_string=current_dt_string, target_id=1 ) connection.commit()
关键注意点
- 不要将Python
datetime对象直接通过f-string拼到SQL语句中,除了格式不匹配的问题,带特殊字符的字符串很容易触发各类语法类报错。 - 执行UPDATE操作后必须调用
connection.commit(),否则数据修改不会真正落库。 - 如果后续查询该字段时,需要默认以
dd-mm-yyyy hh:mm:ss格式返回,可以在会话初始化时设置NLS_DATE_FORMAT参数,或者查询时通过TO_CHAR(COMPLETION_DATE, 'dd-mm-yyyy hh24:mi:ss')做格式转换,不需要修改字段存储类型。
内容的提问来源于stack exchange,提问作者KKL
相关产品推荐
相关产品推荐

