无法将Python连接到Oracle

时间:2018-05-03 08:00:37

标签: python oracle cx-oracle

我想用cx_Oracle将Python连接到本地Oracle。我知道为了建立连接,我应该知道本地IP,端口和SID。所以我通过以下步骤获得这些信息:

本地IP:

%% Mysql DB Config of ChicagoBoss
{db_schema, "your_db_name"}.
{db_username, "boss"}.
{db_password, "boss"}.
{dp_ip, "127.0.0.1"}.
{db_port, 27017 }.
{pool_size, 10}.

端口: 这是来自我的 listener.ora 所以我使用端口1521。

import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())

sid :这让我很烦恼。我尝试了很多,但仍然无法获得正确的sid。这来自我的 tnsnames.ora

# listener.ora Network Configuration File: C:\app\413022472\product\12.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\413022472\product\12.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\413022472\product\12.2.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (orcl)

这是我在 sqlplus 中运行# tnsnames.ora Network Configuration File: C:\app\413022472\product\12.2.0\dbhome_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools. LISTENER_ORCL = (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521)) ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO) ) ) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) 时得到的结果:

select instance_name from v$instance;

我尝试了以下内容:

INSTANCE_NAME
--------------------------------
orcl

这给了我:import cx_Oracle import socket #get local IP: localhost = socket.gethostbyname(socket.gethostname()) #generate dsn: dsn = cx_Oracle.makedsn(localhost, '1521', service_name = 'orcl') #make connection: conn = cx_Oracle.connect("c##scott", "tiger", dsn)

我也试过DatabaseError:ORA-12514, TNS:listener does not currently know of service requested in connect descriptor 这给了我:dsn = cx_Oracle.makedsn(localhost, '1521', sid = 'orcl')

我应该告诉我,我在listener.ora和tnsnames.ora中更改了文本,但我无法记住细节。谁能帮助我成功连接?

3 个答案:

答案 0 :(得分:1)

我会使用此Oracle tutorial的片段(请记得相应地更改用户/传递)。

import cx_Oracle
con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')
print con.version
con.close()

enter image description here

以下是官方cx_Oracle Documentation的链接。

作为this GitHub URL的最后一件事,您可以找到一些可能有助于加快工作的更新示例。

玩得开心,快乐的黑客!

答案 1 :(得分:1)

在侦听器中,有许多因素会影响创建连接。 以下是我的系统中“listener.ora”文件的内容。 在此之前,通过在命令提示符中使用“hostname”验证您的主机名是否有效。在替换侦听器文件的内容之前,需要获取现有listener.ora文件的副本。一旦修改了listener.ora文件,就会重新启动监听器和Oracle服务。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="right-block--wrapper">
     <p>Demo Content</p>               
</div><!-- right-block--wrapper -->

答案 2 :(得分:0)

根据我的经验,这可能是一个令人沮丧的调试错误。您可能已经解决了该错误,但是我将在这里添加我的解决方案,以解决那些通过cx_Oracle连接到Oracle遇到类似错误的人。

这里要注意的重要事项:

  1. 尽管这是一个数据库错误,但不能通过终止并重新启动数据库侦听的服务来解决,这与通过cx_的连接有关。
  2. 确保Oracle客户端和Python具有相同的体系结构,要么都是32位,要么都是64位。这是检查Python体系结构的方法: import platform platform.architecture()
  3. 确保环境路径变量具有Oracle客户端直到bin文件夹的完整路径。
  4. 确保将TNS_ADMIN变量设置为TNS文件所在的位置。
  5. 连接: import cx_Oracle conn = cx_Oracle.connect('<username>','<password>','<service name variable in your TNS file>') 此方法使用TNS文件中提供的连接详细信息,并且cx_Oracle从文件本身访问主机和端口详细信息。