Python / cx_Oracle / 更新记录时Oracle挂起问题
我在Python中有一个类,使用cx_oracle来对数据库进行数据操作,比如这个类的方法:
def executesimple_dml(self, sql):
self.cursor.execute(sql)
self.connection.commit()
对于那些列名没有用引号定义的表,数据操作都很顺利。但是,我有一个表的列名是区分大小写的,并且有空格(用引号定义的)。
当我运行下面这段代码时,它运行得很好:
...
connector.executesimple_dml("update shssdalan_auto_que set action = 'test255' where sw_service_offering = 'SHS-MMSA.SDLAN.SK.BTS LB.WlanAP__w-sk-btslb-0-4-004_SW-SO' ")
但是,当我运行这段代码时,它就一直在运行,没有任何错误:
...
connector.executesimple_dml("""update ds_so set "Operation" = 'test3' where "Name" = 'SHS-MMSA.SDLAN.SK.BTS LB.WlanAP__w-sk-btslb-0-4-004_SW-SO'""")
在Oracle中,我们看到我的连接发送了正确的代码行,但执行却要花很长时间。当我直接在Oracle SQL Developer中运行相同的操作时,它立刻就执行完了。
我们还注意到,下划线会造成一些问题。例如,当我从条件中去掉下划线('SHS-MMSA.SDLAN.SK.BTS LB.WlanAPw-sk-btslb-0-4-004SW-SO')时,它在Python中就能正常工作!
总结一下,这个问题只出现在一个用引号定义的表中,只在使用Python代码时出现,且只有在条件语句中包含下划线时才会出现。当我用类似的代码在不同的表上使用相同的下划线时,它就能正常工作。我知道,这听起来很奇怪……
这应该只是简单地处理一个数据操作。
1 个回答
在Oracle中,我们发现我的连接发送的代码是正确的,但执行起来却要花很长时间。而当我直接在Oracle SQL Developer中运行同样的DML时,它却能立刻执行。
你想修改的那一行数据可能已经被SQL Developer的会话更新过了,但那个会话还没有执行COMMIT
(提交)或ROLLBACK
(回滚),所以这行数据被锁住了,其他会话在等着这个锁被释放。
试着运行一下Python代码,如果代码一直在“等待”,那么就去SQL Developer(或者你用的其他有未提交数据的工具)执行COMMIT
(提交)或ROLLBACK
(回滚)命令,看看Python代码是否突然完成。如果完成了,那说明它是在等这行数据的锁被释放。