Python使用cx_Oracle更新带引号列的Oracle记录时挂起问题
问题解决:cx_Oracle执行带引号列+下划线条件的DML时性能异常
问题场景
使用cx_Oracle编写的Python类执行DML操作,核心代码如下:
def executesimple_dml(self, sql): self.cursor.execute(sql) self.connection.commit()
- 列名未加引号的普通表,DML执行完全正常;
- 针对带空格的大小写敏感列(定义时加引号)的表:
- 执行不带下划线条件的DML无异常;
- 执行带下划线条件的DML时,Python端无限运行无报错,Oracle端可见SQL已发送但耗时极久,相同SQL在Oracle SQL Developer中可立即完成;
- 移除WHERE条件中的下划线后,Python端执行恢复正常。
解决方案
核心问题在于直接拼接SQL字符串导致Oracle优化器无法生成最优执行计划,改用绑定变量即可解决,同时还能避免SQL注入风险。
修改后的代码实现
调整executesimple_dml方法支持绑定变量传入:
def executesimple_dml(self, sql, params=None): params = params or {} self.cursor.execute(sql, params) self.connection.commit()
调用示例
执行目标DML时,用占位符替代直接拼接的字符串值:
sql = """update ds_so set "Operation" = :operation_val where "Name" = :name_val""" connector.executesimple_dml( sql, { "operation_val": "test3", "name_val": "SHS-MMSA.SDLAN.SK.BTS LB.WlanAP__w-sk-btslb-0-4-004_SW-SO" } )
补充排查点
- 对比执行计划:检查Python端和SQL Developer端的Oracle执行计划,确认是否存在全表扫描等低效操作;
- 验证引号匹配:确保带引号的列名、表名与数据库定义完全一致(大小写敏感);
- 更新统计信息:执行
ANALYZE TABLE ds_so COMPUTE STATISTICS;,确保Oracle优化器拥有最新的表统计数据。
内容的提问来源于stack exchange,提问作者Mateusz Topoliński
相关产品推荐
相关产品推荐

