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:
- 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
- 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.
- 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.
- 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.
- 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.