cx_oracle - python oracle 12c
¿Cómo puedo acceder a Oracle desde Python? (7)
¿Cómo puedo acceder a Oracle desde Python? He descargado un instalador msi de cx_Oracle, pero Python no puede importar la biblioteca.
Obtuve el siguiente error:
import cx_Oracle
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
import cx_Oracle
ImportError: DLL load failed: The specified module could not be found.
Estaré agradecido por cualquier ayuda.
Además de cx_Oracle, debe tener la biblioteca cliente de Oracle instalada y las rutas configuradas correctamente para que cx_Oracle pueda encontrarla. Intente abrir la DLL cx_Oracle en "Dependency Walker" ( http://www.dependencywalker.com/ ) para ver lo que es la DLL que falta
Además del cliente instantáneo de Oracle, es posible que también deba instalar los componentes ODAC de Oracle y colocar la ruta de acceso en la ruta del sistema. cx_Oracle parece necesitar acceso al archivo oci.dll que se instala con ellos.
También verifique que obtenga la versión correcta (32 bits o 64 bits) de ellos que coincida con sus versiones de: python, cx_Oracle y cliente instantáneo.
Así es como se ve mi código. También muestra un ejemplo de cómo usar los parámetros de consulta usando un diccionario. Funciona en el uso de Python 3.6:
import cx_Oracle
CONN_INFO = {
''host'': ''xxx.xx.xxx.x'',
''port'': 12345,
''user'': ''SOME_SCHEMA'',
''psw'': ''SECRETE'',
''service'': ''service.server.com''
}
CONN_STR = ''{user}/{psw}@{host}:{port}/{service}''.format(**CONN_INFO)
QUERY = ''''''
SELECT
*
FROM
USER
WHERE
NAME = :name
''''''
class DB:
def __init__(self):
self.conn = cx_Oracle.connect(CONN_STR)
def query(self, query, params=None):
cursor = self.conn.cursor()
result = cursor.execute(query, params).fetchall()
cursor.close()
return result
db = DB()
result = db.query(QUERY, {''name'': ''happy''})
Asegúrate de estos dos y debería funcionar: -
- Python, Oracle instantclient y cx_Oracle son de 32 bits.
- Establecer las variables de entorno.
Soluciona este problema en las ventanas como un encanto.
Esto es lo que funcionó para mí. Mis versiones de Python y Oracle son ligeramente diferentes a las tuyas, pero debería aplicarse el mismo enfoque. Solo asegúrese de que la versión del instalador binario de cx_Oracle coincida con su cliente de Oracle y las versiones de Python.
Mis versiones:
- Python 2.7
- Oracle Instant Client 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Pasos:
- Descargue el paquete Oracle Instant Client. Utilicé instantclient-basic-win32-11.2.0.1.0.zip. Descomprímelo en C: / your / path / to / instantclient_11_2
- Descargue y ejecute el instalador binario cx_Oracle. Utilicé cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Lo instalé para todos los usuarios y lo señalé a la ubicación de Python 2.7 que se encontraba en el registro.
- Establezca las variables de entorno ORACLE_HOME y PATH a través de un script por lotes o cualquier mecanismo que tenga sentido en el contexto de su aplicación, para que apunten al directorio de Oracle Instant Client. Ver la fuente oracle_python.bat a continuación. Estoy seguro de que debe haber una solución más elegante para esto, pero quería limitar lo más posible mis cambios en todo el sistema. Asegúrese de colocar el directorio de Oracle Instant Client de destino al principio de la RUTA (o al menos delante de cualquier otro directorio de clientes de Oracle). En este momento, solo hago tareas de la línea de comandos, así que simplemente ejecuto oracle_python.bat en el shell antes de ejecutar cualquier programa que requiera cx_Oracle.
- Ejecute regedit y compruebe si hay una clave NLS_LANG establecida en / HKEY_LOCAL_MACHINE / SOFTWARE / ORACLE. Si es así, cambie el nombre de la clave (la cambié a NLS_LANG_OLD) o anule la configuración. Esta clave solo debe usarse como el valor predeterminado de NLS_LANG para el cliente de Oracle 7, por lo que es seguro eliminarlo a menos que esté utilizando el cliente de Oracle 7 en otro lugar. Como siempre, asegúrese de hacer una copia de seguridad de su registro antes de hacer cambios.
- Ahora, deberías poder importar cx_Oracle en tu programa Python. Vea la fuente oracle_test.py a continuación. Tenga en cuenta que tuve que establecer la conexión y las cadenas SQL en Unicode para mi versión de cx_Oracle.
Fuente: oracle_python.bat
@echo off
set ORACLE_HOME=C:/your/path/to/instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Fuente: oracle_test.py
import cx_Oracle
conn_str = u''user/password@host: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()
Posibles problemas:
- "ORA-12705: no se puede acceder a los archivos de datos NLS o al entorno no válido especificado": me encontré con esto antes de realizar el cambio en el registro NLS_LANG.
- "TypeError: argumento 1 debe ser Unicode, no str", si necesita establecer la cadena de conexión en Unicode.
- "TypeError: sin esperar ninguno o una cadena", si necesita establecer la cadena SQL en Unicode.
- "ImportError: error en la carga de DLL: no se pudo encontrar el procedimiento especificado". - puede indicar que cx_Oracle no puede encontrar la DLL de cliente de Oracle adecuada.
Si está usando virtualenv, no es tan trivial obtener el controlador con el instalador. Lo que puede hacer entonces: instálelo como lo describe Devon. Luego copie sobre cx_Oracle.pyd y la carpeta cx_Oracle-XXX.egg-info de Python / Lib / site-packages en Lib / site-packages desde su env virtual. Por supuesto, también aquí, la arquitectura y la versión son importantes.
Tenga en cuenta que si está utilizando pandas, puede acceder a él de la siguiente manera:
import pandas as pd
import cx_Oracle
conn= cx_Oracle.connect(''username/pwd@host:port/service_name'')
try:
query = ''''''
SELECT * from dual
''''''
df = pd.read_sql(con = conn, sql = query)
finally:
conn.close()
df.head()