2008-10-29 19 views
25

W jaki sposób łączysz się ze zdalnym serwerem za pośrednictwem adresu IP w taki sposób, że TOAD, SqlDeveloper, są w stanie połączyć się z bazami danych za pomocą tylko adresu IP, nazwy użytkownika, identyfikatora SID i hasła?cx_Oracle & Podłączanie do Oracle DB zdalnie

Ilekroć próbuję określić i adres IP, wydaje się, biorąc go lokalnie.

Innymi słowy, w jaki sposób łańcuch cx_Oracle.connect() powinien być sformatowany do nielokalnej bazy danych?

Było poprzedni post, które wymieniono jako odpowiedź łączącej Oracle za pośrednictwem modułu cx_Oracle z następującego kodu:

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

Odpowiedz

26

można określić serwer w ciągu połączenia, np

import cx_Oracle 
connstr = 'scott/[email protected]:1521/orcl' 
conn = cx_Oracle.connect(connstr) 
  • "serwer" to serwer lub adres IP, jeśli chcesz.
  • "1521" to port, na którym nasłuchuje baza danych.
  • "orcl" to nazwa instancji (lub usługi bazy danych).
+0

To może nie działać we wszystkich środowiskach. W moim przypadku nie działa z Oracle InstantClient 11g i Python 2.6 w 64-bitowym systemie Windows 7. Metoda DSN jest bardziej przenośna. –

+0

@Craig: dzięki za heads-up - czy możesz mi powiedzieć, jak to się nie sprawdziło? Jaki błąd został zgłoszony? –

+0

ORA-12514. Zasadniczo detektor na 'serwerze' nie rozpoznaje' orcl' jako instancji. Nie mogłem tego zrobić, więc wystrzeliłem znacznik pakietów, a wygenerowane DSN (dla pakietu Connect) są znacząco różne. Serwerem jest Oracle 10g, co może być znaczące. –

51

Lubię robić to w ten sposób:

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) 

Jednym z głównych powodów, lubię tej metody jest to, że zwykle mają plik tnsnames.ora leżące wokół gdzieś i mogę sprawdzić, czy dsn_tns obiekt będzie zrobić dobry uczynek, wykonując:

print dsn_tns 

i porównując wyjście do mojego tNSNAMES.ORA

+3

FYI - to nie działa podczas łączenia się z RAC 11g, który wymaga nazwy usługi, a nie identyfikatora SID. Metoda connstr działa jako nazwa usługi. –

+1

Działa to dla mnie, używając 'cx_Oracle-5.1.3-11g.win32-py2.7' i łącząc się z Oracle 10g gdzie jako' user/pass @ host: port/dbname' zawsze kończy się niepowodzeniem. Dziękuję Ci. –

+0

Możesz znaleźć IP z tym 'SELECT SYS_CONTEXT ('USERENV', 'IP_ADDRESS') FROM dual;' i SID z tym 'SELECT sys_context ('USERENV', 'SID') FROM DUAL;' – vizyourdata

0

Inste reklama określania SID, można utworzyć DSN i connect via service_name jak:

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) 

Zaletą używania nazwy usługi zamiast identyfikatora konkretnej instancji (SID), jest to, że to będzie działać w środowisku RAC, a także (użycie identyfikatora SID nie spowoduje). Ten parametr jest dostępny od cx_Oracle version 5.1.1 (28 sierpnia 2011)

+0

Jaka jest nazwa usługi? ?? –

+1

@ A.Raouf: Zobacz [tutaj objaśnienie] (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

Działa to tylko wtedy, gdy użytkownik ma identyfikator SID, który został wycofany na rzecz nazwa_serwera lata temu. Inne odpowiedzi wyjaśniają różnicę. Aktualizacja: inne odpowiedzi już pokazują składnię, którą podałeś. –

Powiązane problemy