segunda-feira, 11 de maio de 2009

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