2008-10-29 31 views
25

¿Cómo se conecta a un servidor remoto a través de una dirección IP de forma que TOAD, SqlDeveloper, pueda conectarse a bases de datos con solo la dirección IP, nombre de usuario, SID y contraseña?cx_Oracle & Conexión a Oracle DB de forma remota

Cada vez que trato de especificar y la dirección IP, parece tomarlo localmente.

En otras palabras, ¿cómo debe formatearse la cadena para cx_Oracle.connect() en una base de datos no local?

Hubo un post anterior, que aparece como una respuesta de conexión a Oracle a través del módulo cx_Oracle con el siguiente código:

#!/usr/bin/python 

import cx_Oracle 
connstr='scott/tiger' 
conn = cx_Oracle.connect(connstr) 
curs = conn.cursor() 

curs.execute('select * from emp') 
print curs.description 
for row in curs: 
    print row 
conn.close() 

Respuesta

26

Puede especificar el servidor en la cadena de conexión, por ejemplo:

import cx_Oracle 
connstr = 'scott/[email protected]:1521/orcl' 
conn = cx_Oracle.connect(connstr) 
  • "servidor" es el servidor, o la dirección IP, si lo desea.
  • "1521" es el puerto en el que está escuchando la base de datos.
  • "orcl" es el nombre de la instancia (o servicio de base de datos).
+0

Esto puede no funcionar en todos los ambientes. En mi caso, no funciona con Oracle InstantClient 11g y Python 2.6 en Windows 7 de 64 bits. El método DSN es más portátil. –

+0

@ Craig: gracias por el aviso: ¿me pueden decir cómo no funcionó? ¿Qué error se informa? –

+0

ORA-12514. Básicamente, el oyente en 'server' no reconoce' orcl' como una instancia. No pude entenderlo, así que preparé un trazador de paquetes y los DSN generados (para el paquete Connect) son significativamente diferentes. El servidor es Oracle 10g, que puede ser significativo. –

51

me gusta hacerlo de esta manera:

ip = '192.168.0.1' 
port = 1521 
SID = 'YOURSIDHERE' 
dsn_tns = cx_Oracle.makedsn(ip, port, SID) 

db = cx_Oracle.connect('username', 'password', dsn_tns) 

Una de las razones principales que me gusta este método es que por lo general tienen un archivo TNSNAMES.ORA por ahí en alguna parte, y puedo comprobar que la dsn_tns objeto va a hacer lo correcto por hacer:

print dsn_tns 

y comparando la salida a mi TNSNAMES.ORA

+3

FYI - esto no funciona cuando se conecta a 11g RAC que requiere un nombre de servicio en lugar de un SID. El método connstr funciona como un nombre de servicio. –

+1

Esto funciona para mí usando 'cx_Oracle-5.1.3-11g.win32-py2.7' y conectando a Oracle 10g donde' user/pass @ host: port/dbname' siempre falla. gracias. –

+0

Puede encontrar IP con este 'SELECCIONAR SYS_CONTEXT ('USERENV', 'IP_ADDRESS') FROM dual;' y SID con este 'SELECT sys_context ('USERENV', 'SID') FROM DUAL;' – vizyourdata

0

INSTE anuncio de especificar el SID, se puede crear un DSN y connect via service_name como:

import cx_Oracle 
ip = '192.168.0.1' 
port = 1521 
service_name = 'my_service' 
dsn = cx_Oracle.makedsn(ip, port, service_name=service_name) 

db = cx_Oracle.connect('user', 'password', dsn) 

La ventaja de usar el nombre del servicio en lugar del identificador de instancia específica (SID), es que va a trabajar en un entorno RAC, así (usar un SID no lo hará). Este parámetro está disponible a partir de cx_Oracle version 5.1.1 (28 Ago, 2011)

+0

¿Cuál es el nombre del servicio? ?? –

+1

@ A.Raouf: Ver [aquí para una explicación] (https://stackoverflow.com/a/43901/429982) – Gerrat

-1
import cx_Oracle 
ip = '172.30.1.234' 
port = 1524 
SID = 'dev3' 
dsn_tns = cx_Oracle.makedsn(ip, port, SID) 

conn = cx_Oracle.connect('dbmylike', 'pass', dsn_tns) 
print conn.version 
conn.close() 
+0

Esto solo funciona si el usuario tiene un SID, que fue desaprobado a favor de service_names hace años. Otras respuestas explican la diferencia. Actualización: otras respuestas ya muestran la sintaxis que proporcionó. –

Cuestiones relacionadas