测试Pyodbc连接对象

问题描述:

我有一个脚本在启动时启动到Teradata数据库的Pyodbc连接。 1小时20分钟后,脚本重新使用连接对象在Teradata上执行查询(使用熊猫)。该查询非常简单,我知道这是正确的,因为我已经手动测试它。当脚本执行它,我收到以下错误信息:测试Pyodbc连接对象

oData = pandas.read_sql(oQuery, oConnexion) 

错误信息:(, DatabaseError(“执行失败的SQL:SELECT DATA_QUALITY_INDICATOR \ -N,DATA_QUALITY_INDICATOR_PARAMETER \ n
,DATA_QUALITY_INDICATOR_PARAMETER_VALUE \ n的 AUDIT_VIEWS.AUDIT_DATA_QUALITY_INDICATOR_PARAMETER甲\ n JOIN AUDIT_VIEWS.AUDIT_DATA_QUALITY_INDICATOR乙ON A.DATA_QUALITY_INDICATOR_KEY = B.DATA_QUALITY_INDICATOR_KEY \ n
WHERE DA TA_QUALITY_INDICATOR = 'DATA_COMPLETENESS_DNA_EXPORT_COUNTER_VS_CSV_DATA' \ n 和DATA_QUALITY_INDICATOR_PARAMETER = 'oMeasures'; \ n( 'HY000', '!该 司机没有提供一个错误')\ n无法回滚”),)

虽然它不是显式的,我在考虑执行失败,因为连接对象可能已超时(请注意,在创建连接对象时没有设置超时)。你会知道一个办法:

  • 保持连接对象在整个过程中活着吗?
  • 在执行查询之前测试连接对象是否仍然有效?

感谢

+0

我想到的一个解决方案,但它不是很优雅的是在执行我想运行的实际查询之前运行一个简单的查询。也许像'select'1''这样简单的测试,只是为了测试连接是否仍然打开。 你觉得呢? –

我实现了以下解决方法这证实它是一个超时问题与连接对象。在重新使用连接对象之前,我正在测试并在测试失败时重新打开连接。

import pyodbc 
try: 
#test current connection object in global variable 
     oConnexion = oGlobalVariable['oConnexion'] 
     oCursor = oConnexion.cursor() 
     oCursor.execute("select '1'") 
     oCursor.close() 
except: 
     #if test fails re-open connection 
     oConnexionString = fGetParameterFile(pFileName="global_parameter.ini", pSectionName="AUDIT", pParameterName="oConnexionString") 
     oConnexion = pyodbc.connect(oConnexionString, autocommit=True) 
     oConnexion.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') 
     oConnexion.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8') 
     oConnexion.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-8') 
     oConnexion.setencoding(encoding='utf-8') 
     oGlobalVariable['oConnexion'] = oConnexion 
     return oConnexion 
else: 
     return oGlobalVariable['oConnexion']