Python acessando Oracle® XE no Ubuntu

No último post vimos como instalar o Oracle® 10g Express Edition no Ubuntu Server (sem ambiente gráfico) e habilitar o acesso remoto via http com o Application Express (apex). Agora nosso objetivo é mostrar como acessar o Oracle® XE a partir de uma aplicação Python.

A biblioteca padrão do Python não oferece suporte nativo ao acesso a bancos de dados SQL. Para este fim precisamos fazer uso de bibliotecas de terceiros. No caso do acesso ao Oracle®, faremos uso da cx_Oracle[1]. Para a instalação dessa biblioteca no Ubuntu recomendamos que seja feito a partir dos fontes disponíveis no sourceforge[2].


I M P O R T A N T E: Para que a instalação seja bem sucedida, garanta que os pré-requisitos do cx_Oracle estejam previamente satisfeitos. Para isto, instale, via apt-get, os pacotes libc6-dev e python-dev. Você também precisará do build-essential ferramentas essenciais para compilação de programas.


Após o download, descompacte o pacote, através dos comandos:
$ tar zxvf cx_Oracle-5.0.1.tar.gz
$ cd cx_Oracle-5.0.1
Antes da instalação propriamente dita, defina as variáveis de ambiente:
$ sudo export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/
$ sudo export LD_LIBRARY_PATH=$ORACLE_HOME/lib
$ sudo export PATH=$ORACLE_HOME/bin:$PATH
Então instale o pacote cx_Oracle:
$ sudo python setup.py install
Pronto! O cx_Oracle deverá estar devidamente instalado.


Nota: Para que as variáveis de ambiente definidas acima sejam permanentes é necessário que os comandos acima sejam executados na inicialização do sistema operacional. Para isto, inclua as definições das variáveis de ambiente no final do arquivo /etc/init.d/bootmisc.sh


Agora é possível, no prompt do Python, fazer algo como:
import cx_Oracle

## execute wants it's parameters in a dictionary
params = {'val_1':"AA"}

## sql statement uses a bind var style of "named" as default - ":" denotes
bind var
sqlstr = "select name from my.table where id = :val_1"

## open a connection
conn = cx_Oracle.Connection("user/pword@server")

## open a cursor
curs = conn.cursor()

## tell Oracle how many rows to fetch
## at a time - default is 1
curs.arraysize = 256

## send the sql statement to Oracle parser for execution
curs.execute(sqlstr, params)

## fetch resultset from cursor
for name in curs.fetchall():
print "name: ", name

Neste exemplo, estamos acessando o Oracle® diretamente do computador que o servidor está instalado. Mas é possível fazê-lo também de forma bastante similar através de uma máquina remota fazendo uso do Oracle® Instant Client (um breve tutorial sobre como usar o Oracle Instant Client aqui[6])

Saudações a todos!

Requisitos
  • cx_Oracle 5.0.1
  • Ubuntu 8.04 (ou superior)
  • Oracle® 10.2.0 (10g) Express Edition (XE)
Referências
  • [1] http://cx-oracle.sourceforge.net/
  • [2] http://ufpr.dl.sourceforge.net/sourceforge/cx-oracle/cx_Oracle-5.0.1.tar.gz
  • [3] http://catherinedevlin.blogspot.com/2007/10/cxoracle-and-oracle-xe-on-ubuntu.html
  • [4] http://www.velocityreviews.com/forums/t333500-any-cxoracle-sample-code.html
  • [5] http://psycoman.psytek.com.br/2008/10/25/python-usando-cx_oracle-com-oracle-instant-client/#more-3
  • [6] http://www.helder.eti.br/2008/11/instalando-o-tora-com-suporte-ao-oracle.html

Comentários

  1. Olá,
    Estou com um problema na hora de importar o cx_Oracle em meu Python.
    Sempre eu devo exportar o ORACLE_HOME.

    Você disse para colocar no bootmisc.sh para carregar automáticamente, porém eu coloquei, e não surtiu efeito.

    Eu coloquei na última linha, ou deve ser em outro local? (Eu utilizo o Ubuntu 9.04)

    Outro detalhe, eu não posso usar sudo export, e sim apenas export.

    ResponderExcluir
  2. Olá novamente,
    Eu coloquei no /etc/profile

    e funcionou a criação das variáveis, porém quando eu dou o import cx_Oracle ele da o seguinte erro:
    ImportError: libclntsh.so.10.1: cannot open shared object file: No such file or directory

    Certo, agora se eu pegar e abrir um terminal e setar as variáveis ali, e digitar python ai ele deixa importar.

    Não sei mais o que fazer, poderia me auxiliar?
    Obrigado!

    ResponderExcluir
  3. O que acontece é que o cx_Oracle não está encontrando esta dependência. Este arquivo, libclntsh.so.10.1, é uma das libs necessárias para o python acessar o Oracle. Ela deve ser setada através da variável de ambiente LD_LIBRARY_PATH. Neste caso, ela se refere a versão 10g do Oracle.
    Provavelmente ainda está tendo problemas ao setar tuas variáveis de ambiente. Você está usando o Ubuntu? Que versão?

    ResponderExcluir
  4. Uma dica: No diretório $ORACLE_HOME/bin (supondo que sua instalação seja do XE, nao testei com outra) já tem um script chamado oracle_env.sh que seta todas as variáveis de ambiente descritas acima. Basta executar esse script na inicialização do sistema.

    Outra dica: Se "sudo export ..." nao funcionar, sete as variáveis antes e execute sudo -E python setup.py install (note o -E que serve para preservar as vars de ambiente durante a execução do comando sudo).

    Eh isso, espero ter ajudado também!

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Mega-Tutorial Flask | The Flask Mega-Tutorial (pt-BR) | Parte II

Mega-Tutorial Flask | The Flask Mega-Tutorial (pt-BR)

Como obter o repositoryId de uma instância do Alfresco