sql >> Database >  >> RDS >> Oracle

Hoe krijg ik toegang tot Oracle vanuit Python?

Dit is wat voor mij werkte. Mijn Python- en Oracle-versies zijn iets anders dan de jouwe, maar dezelfde aanpak zou moeten gelden. Zorg ervoor dat de cx_Oracle binaire installatieversie overeenkomt met uw Oracle-client en Python-versies.

Mijn versies:

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

Stappen:

  1. Download het Oracle Instant Client-pakket. Ik gebruikte instantclient-basic-win32-11.2.0.1.0.zip. Pak het uit naar C:\your\path\to\instantclient_11_2
  2. Download en voer het binaire installatieprogramma cx_Oracle uit. Ik gebruikte cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Ik installeerde het voor alle gebruikers en wees het naar de Python 2.7-locatie die het in het register vond.
  3. Stel de ORACLE_HOME- en PATH-omgevingsvariabelen in via een batchscript of een ander mechanisme dat logisch is in uw app-context, zodat ze verwijzen naar de Oracle Instant Client-directory. Zie de bron Oracle_python.bat hieronder. Ik weet zeker dat hier een elegantere oplossing voor moet zijn, maar ik wilde mijn systeembrede wijzigingen zoveel mogelijk beperken. Zorg ervoor dat u de beoogde Oracle Instant Client-directory aan het begin van het PATH plaatst (of in ieder geval vóór andere Oracle-clientdirectory's). Op dit moment doe ik alleen commandoregeldingen, dus ik voer oracle_python.bat in de shell uit voordat ik programma's start die cx_Oracle vereisen.
  4. Voer regedit uit en controleer of er een NLS_LANG-sleutel is ingesteld op \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. Zo ja, hernoem de sleutel (ik heb deze gewijzigd in NLS_LANG_OLD) of schakel deze uit. Deze sleutel mag alleen worden gebruikt als de standaard NLS_LANG-waarde voor de Oracle 7-client, dus het is veilig om deze te verwijderen, tenzij u de Oracle 7-client ergens anders gebruikt. Maak zoals altijd een back-up van uw register voordat u wijzigingen aanbrengt.
  5. Nu zou je cx_Oracle in je Python-programma moeten kunnen importeren. Zie de Oracle_test.py-bron hieronder. Merk op dat ik de verbinding en SQL-strings op Unicode moest instellen voor mijn versie van cx_Oracle.

Bron:oracle_python.bat

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

Bron: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()

Mogelijke problemen:

  • "ORA-12705:Geen toegang tot NLS-gegevensbestanden of ongeldige omgeving opgegeven" - Ik kwam dit tegen voordat ik de NLS_LANG-registerwijziging aanbracht.
  • "TypeError:argument 1 moet unicode zijn, niet str" - als u de verbindingsreeks op Unicode moet instellen.
  • "TypeError:Expecting None of a string" - als u de SQL-tekenreeks op Unicode moet instellen.
  • "ImportError:DLL-laden mislukt:de opgegeven procedure is niet gevonden." - kan aangeven dat cx_Oracle de juiste Oracle-client-DLL niet kan vinden.


  1. Ik krijg een Er is een poging gedaan om een ​​programma te laden met een onjuiste indelingsfout op een SQL Server-replicatieproject

  2. SQL Server - Automatische verhoging die UPDATE-instructies mogelijk maakt

  3. Bestel een MySQL-tabel met twee kolommen

  4. Een subformulier maken van een tabel in Access 2016