Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich von Python aus auf Oracle zugreifen?

Hier ist, was für mich funktioniert hat. Meine Python- und Oracle-Versionen unterscheiden sich geringfügig von Ihren, aber es sollte der gleiche Ansatz gelten. Stellen Sie einfach sicher, dass die Version des cx_Oracle-Binärinstallationsprogramms mit Ihrer Oracle-Client- und Python-Version übereinstimmt.

Meine Versionen:

  • Python 2.7
  • Oracle Instant Client 11G R2
  • cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
  • Windows XP SP3

Schritte:

  1. Laden Sie das Oracle Instant Client-Paket herunter. Ich habe instantclient-basic-win32-11.2.0.1.0.zip verwendet. Entpacken Sie es nach C:\Ihr\Pfad\zu\instantclient_11_2
  2. Laden Sie das cx_Oracle-Binärinstallationsprogramm herunter und führen Sie es aus. Ich habe cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi verwendet. Ich habe es für alle Benutzer installiert und auf den Python 2.7-Speicherort verwiesen, den es in der Registrierung gefunden hat.
  3. Setzen Sie die Umgebungsvariablen ORACLE_HOME und PATH über ein Batch-Skript oder einen beliebigen Mechanismus, der in Ihrem App-Kontext sinnvoll ist, sodass sie auf das Oracle Instant Client-Verzeichnis zeigen. Siehe Quelle oracle_python.bat unten. Ich bin mir sicher, dass es dafür eine elegantere Lösung geben muss, aber ich wollte meine systemweiten Änderungen so weit wie möglich einschränken. Stellen Sie sicher, dass Sie das gewünschte Oracle Instant Client-Verzeichnis an den Anfang des PATH setzen (oder zumindest vor alle anderen Oracle-Client-Verzeichnisse). Im Moment mache ich nur Kommandozeilen-Sachen, also führe ich einfach oracle_python.bat in der Shell aus, bevor ich Programme ausführe, die cx_Oracle benötigen.
  4. Führen Sie regedit aus und prüfen Sie, ob unter \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE ein NLS_LANG-Schlüsselsatz vorhanden ist. Wenn ja, benennen Sie den Schlüssel um (ich habe ihn in NLS_LANG_OLD geändert) oder deaktivieren Sie ihn. Dieser Schlüssel sollte nur als NLS_LANG-Standardwert für den Oracle 7-Client verwendet werden, daher ist es sicher, ihn zu entfernen, es sei denn, Sie verwenden den Oracle 7-Client irgendwo anders. Stellen Sie wie immer sicher, dass Sie Ihre Registrierung sichern, bevor Sie Änderungen vornehmen.
  5. Jetzt sollten Sie in der Lage sein, cx_Oracle in Ihr Python-Programm zu importieren. Siehe die Quelle oracle_test.py unten. Beachten Sie, dass ich die Verbindungs- und SQL-Strings für meine Version von cx_Oracle auf Unicode setzen musste.

Quelle:oracle_python.bat

@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%

Quelle:oracle_test.py

import cx_Oracle

conn_str = u'user/[email protected]:port/service'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select your_col_1, your_col_2 from your_table')
for row in c:
    print row[0], "-", row[1]
conn.close()

Mögliche Probleme:

  • "ORA-12705:Zugriff auf NLS-Datendateien nicht möglich oder ungültige Umgebung angegeben" – Ich bin darauf gestoßen, bevor ich die NLS_LANG-Registrierungsänderung vorgenommen habe.
  • "TypeError:argument 1 must be unicode, not str" - wenn Sie die Verbindungszeichenfolge auf Unicode setzen müssen.
  • "TypeError:Expecting None or a string" - wenn Sie den SQL-String auf Unicode setzen müssen.
  • "ImportError:DLL-Laden fehlgeschlagen:Die angegebene Prozedur konnte nicht gefunden werden." - kann darauf hinweisen, dass cx_Oracle die entsprechende Oracle-Client-DLL nicht finden kann.