viernes, 29 de mayo de 2015

Oracle en Linux - Instalación de cx_Oracle (I)

A alguno de vosotros, igual habéis tenido que trabajar con Oracle des de un sistema Linux. Para ello, Oracle pone a disposición un OracleInstantClient y diferentes herramientas que no son nada más que conectores para que otros programas tengan los Drivers adecuados para conectarse a la Base de Datos.

Últimamente, en mis desarrollos con Python, tengo que trabajar con Oracle y siempre estoy buscando diferentes maneras de instalar los drivers y el cliente "estandard" de Python, y aunque no es complejo, si que hay que seguir una serie de pasos.

Así que he desarrollado un pequeño FAQ

Primero de todo, descargar de Oracle:

Basic Drivers



InstantClient SDK 




OraclePlus


Nota:
Os va a pedir que os registréis, es gratuito y no hay ningún problema en hacerlo.

Una vez descargado, recomiendo descomprimir todos los archivos en

/opt/oracle/instantclient/


Configuración de entorno:

Podemos encontrar problemas a la hora de instalar mediante PIP, el paquete cx_Oracle, para ello es necesario antes que nada en crear softlinks de las diferentes librerias que va a necesitar para compilar el paquete :

# cd /opt/oracle/instantclient/
# ln -s libclntsh.so.12.1 libclntsh.so
# ln -s libocci.so.12.1 libocci.so


Por otro lado, antes de instalar cx_Oracle, es necesario también crear la variable de entorno $ORACLE_HOME apuntando al directorio arriba mencionado

# echo $ORACLE_HOME
/opt/oracle/instantclient
# env | grep ORACLE_HOME
ORACLE_HOME=/opt/oracle/instantclient
# sudo pip install cx_Oracle
Downloading/unpacking cx-Oracle
Running setup.py egg_info for package cx-Oracle
    
Installing collected packages: cx-Oracle
  Running setup.py install for cx-Oracle
    building 'cx_Oracle' extension
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/opt/oracle/instantclient/sdk/include -I/usr/include/python2.7 -c cx_Oracle.c -o build/temp.linux-x86_64-2.7-12c/cx_Oracle.o -DBUILD_VERSION=5.1.3
    In file included from /opt/oracle/instantclient/sdk/include/oci.h:3488:0,
                     from cx_Oracle.c:10:
    /opt/oracle/instantclient/sdk/include/ociap.h:10858:1: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
    /opt/oracle/instantclient/sdk/include/ociap.h:10864:1: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
    In file included from /opt/oracle/instantclient/sdk/include/oci.h:3491:0,
                     from cx_Oracle.c:10:
    /opt/oracle/instantclient/sdk/include/ocixmldb.h:208:1: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-x86_64-2.7-12c/cx_Oracle.o -L/opt/oracle/instantclient -lclntsh -o build/lib.linux-x86_64-2.7-12c/cx_Oracle.so
    
Successfully installed cx-Oracle
Cleaning up...


Para comprobar que esta correctamente instalado, iniciamos python des de un terminal de interprete y ejecutamos : 

# python
Python 2.7.3 (default, Mar 13 2014, 11:03:55) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> help(modules)

Buscamos el módulo cx_Oracle en la lista para confirmar que esta instalado.  

A partir de aquí, en la siguiente entrega, comentaremos como crear un programa para conectarnos a Oracle.

FAQ: 

Puede ser que salga un error a la hora de cargar una libreria dinamica de oracle.

Solución: 

# echo "/opt/oracle/instantclient" > /etc/ld.so.conf.d/oracle.conf
# ldconfig




No hay comentarios: