执行Python SQL语句报错ORA-00904:"I5"无效标识符,求排查解决
ORA-00904错误排查与解决
- 错误根源:你用
%s直接拼接字符串生成SQL时,若hostname是字符串值(比如I5),拼接后的SQL语句会变成TA_labor.CUSER1 = I5——Oracle会把I5当成列名而非字符串常量,这就触发了ORA-00904错误。而你在SQL Developer中执行时,肯定给字符串加了单引号(比如TA_labor.CUSER1 = 'I5'),所以能正常运行。 - 正确解决方案:使用cx_Oracle的参数绑定机制,不要直接拼接字符串,这既解决语法问题,还能防范SQL注入:
也可以使用命名参数让代码更易读:c.execute('select * from IQMS.work_center, IQMS.TA_labor where work_center.ID = TA_labor.WORK_CENTER_ID and TA_labor.CUSER1 = :1', (hostname,))c.execute('select * from IQMS.work_center, IQMS.TA_labor where work_center.ID = TA_labor.WORK_CENTER_ID and TA_labor.CUSER1 = :hostname', {'hostname': hostname}) - 重要提醒:永远不要用字符串拼接构造带参数的SQL,参数绑定是数据库操作的标准安全规范,还能避免因特殊字符、数据类型不匹配引发的各类语法错误。
内容的提问来源于stack exchange,提问作者Somanath Prakash
相关产品推荐
相关产品推荐

