2017-06-05 87 views
0

我有一個腳本在啓動時啓動到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''這樣簡單的測試,只是爲了測試連接是否仍然打開。 你覺得呢? –

回答

0

我實現了以下解決方法這證實它是一個超時問題與連接對象。在重新使用連接對象之前,我正在測試並在測試失敗時重新打開連接。

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']