Tady je to, co se mi osvědčilo. Moje verze Pythonu a Oracle se mírně liší od vaší, ale měl by platit stejný přístup. Jen se ujistěte, že verze binárního instalačního programu cx_Oracle odpovídá verzi vašeho klienta Oracle a verzi Pythonu.
Moje verze:
- Python 2.7
- Oracle Instant Client 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Kroky:
- Stáhněte si balíček Oracle Instant Client. Použil jsem instantclient-basic-win32-11.2.0.1.0.zip. Rozbalte jej do složky C:\vaše\cesta\k\instantclient_11_2
- Stáhněte si a spusťte binární instalační program cx_Oracle. Použil jsem cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Nainstaloval jsem ji pro všechny uživatele a nasměroval ji na umístění Pythonu 2.7, které našel v registru.
- Nastavte proměnné prostředí ORACLE_HOME a PATH pomocí dávkového skriptu nebo jiného mechanismu, který má smysl v kontextu vaší aplikace, tak, aby odkazovaly na adresář Oracle Instant Client. Viz zdroj oracle_python.bat níže. Jsem si jistý, že na to musí existovat elegantnější řešení, ale chtěl jsem co nejvíce omezit své systémové změny. Ujistěte se, že jste cílový adresář Oracle Instant Client umístili na začátek PATH (nebo alespoň před jakékoli jiné adresáře klienta Oracle). Právě teď dělám pouze věci z příkazového řádku, takže před spuštěním jakýchkoli programů, které vyžadují cx_Oracle, stačí spustit oracle_python.bat v shellu.
- Spusťte regedit a zkontrolujte, zda je v \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE nastaven klíč NLS_LANG. Pokud ano, přejmenujte klíč (změnil jsem ho na NLS_LANG_OLD) nebo jej zrušte. Tento klíč by měl být použit pouze jako výchozí hodnota NLS_LANG pro klienta Oracle 7, takže je bezpečné jej odstranit, pokud náhodou nepoužíváte klienta Oracle 7 někde jinde. Jako vždy si před provedením změn nezapomeňte zálohovat registr.
- Nyní byste měli být schopni importovat cx_Oracle do vašeho programu Python. Podívejte se na zdroj oracle_test.py níže. Všimněte si, že jsem pro svou verzi cx_Oracle musel nastavit připojení a řetězce SQL na Unicode.
Zdroj:oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Zdroj: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()
Možné problémy:
- "ORA-12705:Nemohu přistupovat k datovým souborům NLS nebo je zadáno neplatné prostředí" – narazil jsem na to předtím, než jsem provedl změnu registru NLS_LANG.
- "TypeError:argument 1 musí být unicode, nikoli str" - pokud potřebujete nastavit připojovací řetězec na Unicode.
- "TypeError:očekává se žádný nebo řetězec" – pokud potřebujete nastavit řetězec SQL na Unicode.
- "ImportError:Načtení DLL se nezdařilo:Zadaný postup nebyl nalezen." - může znamenat, že cx_Oracle nemůže najít příslušnou knihovnu DLL klienta Oracle.