python:cx\u oracle cursor.execute()挂起更新查询

gjmwrych  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(346)

我也研究过类似的问题,但到目前为止,没有什么对我有效
就是这样。我想通过python脚本更新我的表。我使用的是cx\u oracle模块。我可以执行select查询,但是每当我尝试执行update查询时,我的程序就会挂起(冻结)。我意识到,如果我正在更新一个表,但我的代码永远不会超过cursor.commit(),那么我需要在cursor.execute()之后使用cursor.commit()。我在下面添加了一个代码片段,我正在使用它进行调试。
有什么建议吗??
代码

import cx_Oracle

def getConnection():
    ip = '127.0.0.1'
    port = 1521
    service_name = 'ORCLCDB.localdomain'
    username = 'username'
    password = 'password'
    dsn = cx_Oracle.makedsn(ip, port, service_name=service_name)  # (CONNECT_DATA=(SERVICE_NAME=ORCLCDB.localdomain)))
    return cx_Oracle.connect(username, password, dsn) # connection

def debugging():
    con = getConnection()
    print(con)
    cur = con.cursor()
    print('Updating')
    cur.execute('UPDATE EMPLOYEE SET LATITUDE = 53.540943 WHERE EMPLOYEEID = 1')
    print('committing')
    con.commit()
    con.close()
    print('done')

debugging()

以下是相应的输出:

<cx_Oracle.Connection to username@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLCDB.localdomain)))>
Updating

解决方案
经过一番摸索,我找到了根本原因!我使用oraclesqldeveloper对表进行了更改,但没有提交这些更改,当python脚本试图对表进行更改时,它会因此而冻结。为了避免冻结,在运行python脚本之前,我在oraclesqldeveloper中提交了我的更改,而且效果很好!

knpiaxh1

knpiaxh11#

你有办法查数据库吗?我的意思是,为了了解这是否是python程序的问题,我们需要检查数据库中的v$会话,以了解是否有东西被阻塞了。

select sid, event, last_call_et, status from v$session where sid = xxx

其中是与python连接的会话的sid。
顺便说一下,我会选择在游标执行之后显式提交

cur.execute('UPDATE EMPLOYEE SET LATITUDE = 53.540943 WHERE EMPLOYEEID = 1')
con.commit()

希望它能帮上大忙

相关问题