测试Pyodbc连接对象

时间:2017-06-05 08:04:35

标签: python connection timeout pyodbc

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

oData = pandas.read_sql(oQuery, oConnexion)
  

错误讯息:(,   DatabaseError(" sql执行失败:SELECT   DATA_QUALITY_INDICATOR \ n,DATA_QUALITY_INDICATOR_PARAMETER \ n
  ,DATA_QUALITY_INDICATOR_PARAMETER_VALUE \ n FROM   AUDIT_VIEWS.AUDIT_DATA_QUALITY_INDICATOR_PARAMETER A \ n加入   AUDIT_VIEWS.AUDIT_DATA_QUALITY_INDICATOR B ON   A.DATA_QUALITY_INDICATOR_KEY = B.DATA_QUALITY_INDICATOR_KEY \ n
  哪里   DATA_QUALITY_INDICATOR =' DATA_COMPLETENESS_DNA_EXPORT_COUNTER_VS_CSV_DATA' \ n   AND DATA_QUALITY_INDICATOR_PARAMETER =' oMeasures'; \ n(' HY000',' The   驱动程序没有提供错误!')\ n \ n无法回滚",),)

虽然它不明确,但我认为执行失败是因为连接对象可能已经超时(注意在创建连接对象时没有设置超时)。你知道的方法:

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

由于

1 个答案:

答案 0 :(得分: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']