通过 pyodbc 挂起更新 Oracle DB
Updating Oracle DB via pyodbc hangs
我在将 pyodbc 与 Oracle 数据库一起使用时遇到问题。我可以执行 select 语句并返回结果,但是当我尝试更新记录时,程序似乎在 "conn.execute(query)" 行期间挂起,没有任何错误消息。我必须强制退出应用程序。
运行 select 语句检索预期结果。更新同一条记录将挂起。
我还在其他应用程序上使用了这个定义,在 selects 和更新正常工作的 MSSQL DB 上没有问题。我还检查了用户/通行证是否具有读写权限
import pyodbc
def connect_odbc(conn_str, query, commit=False):
"""
Returns result set from connection string.
If commit is set to true, it will write to DB as well
"""
if commit:
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute(query) ### <--- Program hangs here
cursor.commit()
cursor.close()
return True
else:
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
## Main Program ##
query = "select * from multishipdtl where cartonid = '100000000060506';"
queryupdate = "update multishipdtl set trackid='88888888' where cartonid = '100000000060506';"
conn_str = '''DSN=syntest;UID=userid;PWD=userpass'''
results = connect_odbc(conn_str, query) ### This connects ok with expected results
connect_odbc(conn_str, queryupdate, commit=True) ### Update statement hangs
如果程序在执行 cursor.execute("UPDATE ...")
时挂起,我首先要检查的是它是否正在等待数据库响应:How do you show SQL executing on an Oracle database?
- 如果数据库显示您的会话 运行 UPDATE,很可能是因为另一个事务锁定了您尝试更新的行 - 请参阅 Oracle database is hanging infinitly in UPDATE queries; otherwise check
V$SESSION
's status
and wait_time
, and V$SESSION_WAIT
's event
。您可能还想尝试通过 运行 来自 SQL 客户端(无 Python)的更新来重现此内容。
- 如果不是数据库,请检查 Python 的调用堆栈以获取提示。当您按 CTRL+C 中止程序时应该打印它,如果没有 - 尝试 Showing the stack trace from a running Python application
ODBC trace log 也可能有帮助。
我在将 pyodbc 与 Oracle 数据库一起使用时遇到问题。我可以执行 select 语句并返回结果,但是当我尝试更新记录时,程序似乎在 "conn.execute(query)" 行期间挂起,没有任何错误消息。我必须强制退出应用程序。
运行 select 语句检索预期结果。更新同一条记录将挂起。 我还在其他应用程序上使用了这个定义,在 selects 和更新正常工作的 MSSQL DB 上没有问题。我还检查了用户/通行证是否具有读写权限
import pyodbc
def connect_odbc(conn_str, query, commit=False):
"""
Returns result set from connection string.
If commit is set to true, it will write to DB as well
"""
if commit:
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute(query) ### <--- Program hangs here
cursor.commit()
cursor.close()
return True
else:
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
## Main Program ##
query = "select * from multishipdtl where cartonid = '100000000060506';"
queryupdate = "update multishipdtl set trackid='88888888' where cartonid = '100000000060506';"
conn_str = '''DSN=syntest;UID=userid;PWD=userpass'''
results = connect_odbc(conn_str, query) ### This connects ok with expected results
connect_odbc(conn_str, queryupdate, commit=True) ### Update statement hangs
如果程序在执行 cursor.execute("UPDATE ...")
时挂起,我首先要检查的是它是否正在等待数据库响应:How do you show SQL executing on an Oracle database?
- 如果数据库显示您的会话 运行 UPDATE,很可能是因为另一个事务锁定了您尝试更新的行 - 请参阅 Oracle database is hanging infinitly in UPDATE queries; otherwise check
V$SESSION
'sstatus
andwait_time
, andV$SESSION_WAIT
'sevent
。您可能还想尝试通过 运行 来自 SQL 客户端(无 Python)的更新来重现此内容。 - 如果不是数据库,请检查 Python 的调用堆栈以获取提示。当您按 CTRL+C 中止程序时应该打印它,如果没有 - 尝试 Showing the stack trace from a running Python application
ODBC trace log 也可能有帮助。