cx_Oracle._Error 在 Python 脚本中

cx_Oracle._Error in Python script

我已尝试搜索解决方案或至少一些故障排除步骤,以了解为什么我在执行 Python 脚本时会看到这些错误。到目前为止没有运气。我通过 SSH 连接到 Rackspace 来执行此操作。

错误引用了 Oracle 数据库。更具体地说,它是 cx_Oracle._Error 和 cx_Oracle.DatabaseError 在不同的场合。下面是服务器日志中几行的示例。它没有提供比这更多的信息。

Running against Oracle server: prod.somecompanyname + prod123
Error connecting to databases: (<cx_Oracle._Error object at0x7ffff7fe9af8>,) 
Error verifying existing Oracle records

我的同事能够成功执行脚本并且没有遇到错误。我比较了我们的 .bash_profile 和 .bashrc 并没有什么不同。脚本中的 Oracle 服务器凭据以及 Oracle 环境路径都是正确的。这可能与我这边的某些东西无关,但我不知道在哪里。

如有任何关于在何处解决此问题的建议,我们将不胜感激。

def oraclerecords(logger, env, db1Pass, db2Pass, db3Pass, verifyRecordset):
  import cx_Oracle
  retval = None

  try:
    db1UID='somedb1name'
    db2UID='somedb2name'
    if env == 'p':
      dbServer='prod.somecompanyname.com'
      dbSID='SIDPR'
    elif env == 's':
      dbServer='stage.somecompanyname.com'
      dbSID='SIDSTG'
    elif env == 'r':
      dbServer='stage.somecompanyname.com'
      dbSID='SIDDEV'

    db3UID = 'somedb3name'
    db3SID = 'db3HUB'

    logger.info('Running against Oracle server:' + dbServer + ' SID:' + dbSID)
    connString = (db1UID + '/' + db1Pass + '@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS='
      '(PROTOCOL=TCP)(HOST=' + dbServer + ')(PORT=1234)))(CONNECT_DATA=(SID=' + dbSID + ')))')
    conndb1 = cx_Oracle.connect(connString)
    curdb1 = conndb1.cursor()
    curdb0 = conndb1.cursor()

    connString = (db2UID + '/' + db2Pass + '@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS='
      '(PROTOCOL=TCP)(HOST=' + dbServer + ')(PORT=1234)))(CONNECT_DATA=(SID=' + dbSID + ')))')
    conndb2 = cx_Oracle.connect(connString)
    curdb2 = conndb2.cursor()

    connString = (db3UID + '/' + db3Pass + '@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS='
      '(PROTOCOL=TCP)(HOST=prod.atsomecompany.com)(PORT=1234)))(CONNECT_DATA=(SID=' + db3SID + ')))')
    conndb3 = cx_Oracle.connect(connString)
    curdb3 = conndb3.cursor()
  except Exception as e:
    logger.error('Error connecting to databases: ' + str(e.args))
    return verifyRecordset, 2

您的 Python 脚本的问题在于此行:

  logger.error('Error connecting to databases: ' + str(e.args))

也许最简单的改进方法是将其替换为以下内容:

  logger.error('Error connecting to databases: ' + str(e))

我编写了以下简短的 Python 脚本来尝试连接到 Oracle XE 数据库:

import cx_Oracle

connect_string = "..."
try:
    conn = cx_Oracle.connect(connect_string)
    print "Got connection"
except Exception as e:
    print str(e.args)
    print str(e)

我知道这个脚本会引发异常,因为它试图连接的数据库和侦听器都已关闭。当我 运行 时,我得到以下输出:

(<cx_Oracle._Error object at 0x02354308>,)
ORA-12541: TNS:no listener

这里的第一行没有告诉我任何有用的信息,但第二行包含更有用的信息。

希望在对您的脚本进行此更改后,您会看到更有用的错误消息,这应该可以帮助您找出真正的问题所在。