2008-10-29 2 views
25

Wie stellen Sie eine Verbindung zu einem Remote-Server über IP-Adresse in der Weise her, dass TOAD, SqlDeveloper mit Datenbanken mit nur der IP-Adresse, Benutzername, SID und Passwort verbinden können?cx_Oracle & Remote-Verbindung mit Oracle DB

Immer wenn ich versuche, IP-Adresse anzugeben, scheint es, es lokal zu nehmen.

Mit anderen Worten, wie sollte die Zeichenfolge für cx_Oracle.connect() in einer nicht lokalen Datenbank formatiert werden?

Es gab einen früheren Post, die als Antwort auf Oracle über cx_Oracle Modulanschluss aufgelistet mit dem folgenden Code:

#!/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() 

Antwort

26

Sie den Server in der Verbindungszeichenfolge angeben, zB:

import cx_Oracle 
connstr = 'scott/[email protected]:1521/orcl' 
conn = cx_Oracle.connect(connstr) 
  • "Server" ist der Server oder die IP-Adresse, wenn Sie möchten.
  • "1521" ist der Port, den die Datenbank überwacht.
  • "orcl" ist der Name der Instanz (oder des Datenbankdienstes).
+0

Dies funktioniert möglicherweise nicht in allen Umgebungen. In meinem Fall funktioniert es nicht mit Oracle InstantClient 11g und Python 2.6 unter 64-Bit Windows 7. Die DSN-Methode ist portabler. –

+0

@Craig: Danke für das Heads-Up - kannst du mir sagen, wie es nicht funktioniert hat? Welcher Fehler wird gemeldet? –

+0

ORA-12514. Grundsätzlich erkennt der Listener auf 'server'' orcl' nicht als Instanz. Ich konnte davon nichts machen, also habe ich einen Packet Tracer hochgefahren, und die DSNs, die generiert werden (für das Connect-Paket), sind signifikant verschieden. Der Server ist Oracle 10g, was von Bedeutung sein kann. –

51

Ich mag es auf diese Weise tun:

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) 

Einer der wichtigsten Gründe, warum ich diese Methode mag, ist, dass ich in der Regel eine Datei TNSNAMES.ORA um irgendwo liegen haben, und ich kann prüfen, ob die dsn_tns Objekt wird das richtige tun, indem Sie:

print dsn_tns 

und Vergleichen der Ausgabe meiner TNSNAMES.ORA

+3

FYI - dies funktioniert nicht beim Herstellen einer Verbindung zu 11g RAC, die einen Dienstnamen anstelle einer SID erfordert. Die connstr-Methode funktioniert als Dienstname. –

+1

Das funktioniert für mich mit 'cx_Oracle-5.1.3-11g.win32-py2.7' und Verbindung zu Orakel 10g wo als 'Benutzer/pass @ Host: Port/DB-Name' immer fehlschlägt. Danke. –

+0

Sie finden IP mit diesem 'SELECT SYS_CONTEXT ('USERENV', 'IP_ADDRESS') FROM dual;' und SID mit diesem 'SELECT sys_context ('USERENV', 'SID') FROM DUAL;' – vizyourdata

0

Inste Anzeige von der SID angeben, können Sie eine dsn und connect via service_name wie schaffen:

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) 

Der Vorteil der Servicenamen anstelle der spezifischen Instanz-ID (SID) zu verwenden, ist, dass es auch in einer RAC-Umgebung arbeiten (mit einer SID wird nicht). Dieser Parameter ist verfügbar ab cx_Oracle version 5.1.1 (28.08.2011)

+0

Was ist der Servicename? ?? –

+1

@ A.Raouf: Siehe [hier für eine Erklärung] (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

Dies funktioniert nur, wenn der Benutzer eine SID hat, die vor Jahren für service_names veraltet wurde. Andere Antworten erklären den Unterschied. Update: Andere Antworten zeigen bereits die Syntax, die Sie angegeben haben. –