Ето какво ми свърши работа. Моите версии на Python и Oracle са малко по-различни от вашите, но трябва да се прилага същият подход. Просто се уверете, че версията на двоичния инсталатор на cx_Oracle съвпада с версиите на вашия клиент на Oracle и Python.
Моите версии:
- Python 2.7
- Oracle Instant Client 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Стъпки:
- Изтеглете пакета Oracle Instant Client. Използвах instantclient-basic-win32-11.2.0.1.0.zip. Разархивирайте го в C:\your\path\to\instantclient_11_2
- Изтеглете и стартирайте двоичния инсталатор на cx_Oracle. Използвах cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Инсталирах го за всички потребители и го насочих към местоположението на Python 2.7, което намери в системния регистър.
- Задайте променливите на средата ORACLE_HOME и PATH чрез пакетен скрипт или какъвто и да е механизъм, който има смисъл в контекста на вашето приложение, така че да сочат към директорията на Oracle Instant Client. Вижте източника на oracle_python.bat по-долу. Сигурен съм, че трябва да има по-елегантно решение за това, но исках да огранича промените в цялата система, доколкото е възможно. Уверете се, че сте поставили целевата директория Oracle Instant Client в началото на PATH (или поне преди всяка друга клиентска директория на Oracle). В момента правя само неща от командния ред, така че просто стартирам oracle_python.bat в обвивката, преди да стартирам всякакви програми, които изискват cx_Oracle.
- Изпълнете regedit и проверете дали има ключ NLS_LANG, зададен в \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. Ако е така, преименувайте ключа (промених го на NLS_LANG_OLD) или го премахнете. Този ключ трябва да се използва само като стойност по подразбиране NLS_LANG за Oracle 7 клиента, така че е безопасно да го премахнете, освен ако случайно не използвате Oracle 7 клиента някъде другаде. Както винаги, не забравяйте да архивирате системния си регистър, преди да направите промени.
- Сега трябва да можете да импортирате cx_Oracle във вашата програма на Python. Вижте източника na oracle_test.py по-долу. Имайте предвид, че трябваше да задам низовете за връзка и SQL на Unicode за моята версия на cx_Oracle.
Източник:oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Източник: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()
Възможни проблеми:
- „ORA-12705:Няма достъп до файлове с NLS данни или е посочена невалидна среда“ – попаднах на това, преди да направя промяната в системния регистър NLS_LANG.
- „TypeError:аргумент 1 трябва да бъде unicode, а не str“ – ако трябва да зададете низа за връзка на Unicode.
- „TypeError:очаквам None или низ“ – ако трябва да зададете SQL низа на Unicode.
- „ImportError:DLL неуспешно зареждане:Посочената процедура не може да бъде намерена.“ - може да показва, че cx_Oracle не може да намери подходящата клиентска DLL на Oracle.