| Documentação do PostgreSQL 8.0.0 | ||||
|---|---|---|---|---|
| Anterior | Início | Capítulo 39. PL/Ruby - Linguagem procedural Ruby | Fim | Próxima |
O Ruby-Postgres é uma biblioteca de extensão que permite acesso ao PostgreSQL a partir da linguagem Ruby.
O Ruby-Postgres é um projeto independente, que não faz parte da distribuição padrão do PostgreSQL, cujo mantenedor atual é Dave Lee <dave@cherryville.org> . O projeto está relacionado em RAA - Ruby Application Archive, na categoria Biblioteca/Banco de Dados, e descrito na página RAA - postgres. A página do projeto se encontra em Postgres(Ruby extension library). Para instalar o Ruby-Postgres, primeiro deve ser baixado o arquivo ruby-postgres-20051221.tar.gz, ou mais recente.
Os programas Ruby utilizando a biblioteca Ruby-Postgres para acessar o PostgreSQL podem ser desenvolvidos e testados utilizando o Eclipse, bastando para isso instalar o pugin Ruby Development Tool.
Antes de instalar o Ruby-Postgres pode ser necessário instalar todos os cabeçalhos do PostgreSQL através do comando gmake install (consulte o Capítulo 14). A instalação foi feita no diretório /usr/local/src/ruby-postgres/, com o arquivo ruby-postgres-20051221.tar.gz baixado no diretório /download, conforme mostrado a seguir:
cd /download/ wget http://ruby.scripting.ca/postgres/archive/ruby-postgres-20051221.tar.gz cd /usr/local/src/ tar xzvf /download/ruby-postgres-20051221.tar.gz cd ruby-postgres/ ruby extconf.rb make make install /usr/bin/install -c -m 0755 postgres.so /usr/lib/site_ruby/1.8/i386-linux
O arquivo README no diretório de instalação contém as instruções de instalação.
No comando ruby extconf.rb pode ser necessário especificar o nome do diretório dos arquivos de inclusão e a biblioteca -lpq utilizando:
--with-pgsql-include-dir=<diretório dos arquivos de inclusão> --with-pgsql-lib-dir=<diretório da biblioteca>
ou
--with-pgsql-dir=<diretório>
que é o mesmo que
--with-pgsql-include-dir=<diretório>/include, --with-pgsql-lib-dir=<diretório>/lib
Por exemplo:
ruby extconf.rb --with-pgsql-include-dir=/usr/local/pgsql/include \
--with-pgsql-lib-dir=/usr/local/pgsql/lib
# ou
ruby extconf.rb --with-pgsql-dir=/usr/local/pgsql/
Esta seção tem por finalidade mostrar exemplos de utilização de programas escritos em Ruby acessando o PostgreSQL.
Exemplo 39-15. Programa Ruby listar as linhas da tabela
O programa deste exemplo se conecta ao banco de dados plruby, e lista as colunas de todas as linhas da tabela emp, usada no exemplo de gatilho, referenciando as colunas pelo nome e pela posição na linha, e utilizando o método inspect. Primeiro foi utilizado o comando
su - postgres
para tornar o postgres o usuário do sistema e seu diretório base o diretório corrente. Em seguida foi criado o arquivo emp.rb mostrado abaixo
require 'postgres'
conn = PGconn.open('dbname' => 'plruby')
res = conn.exec('SELECT nome_emp, salario FROM emp')
warn "==================================="
res.each do |linha|
puts "pelo nome: #{linha['nome_emp']}\t#{linha['salario']}"
puts "pela posição: #{linha[0]}\t#{linha[1]}"
puts "por inspeção: #{linha.inspect}"
warn "==================================="
end
res.clear
conn.close
cuja execução produziu o seguinte resultado:
$ ruby emp.rb =================================== pelo nome: José 1500 pela posição: José 1500 por inspeção: ["Jos\351", 1500] =================================== pelo nome: Maria 2500 pela posição: Maria 2500 por inspeção: ["Maria", 2500] ===================================
Exemplo 39-16. Programa Ruby semelhante ao programa testlibpq.c
Este programa é uma conversão para a linguagem Ruby do programa testlibpq.c escrito na linguagem C. A conversão foi feita por sven em 2006-01-08 20:38:25 +0100, e a página original se encontra em test1.rb. Existem outros programas Ruby em ruby-postgres, inclusive uma versão do psql escrita em Ruby. No programa test1.rb, mostrado abaixo, é feita a conexão com o banco de dados template1 usando o usuário teste, cuja senha também é teste:
#! /usr/bin/env ruby
#
# Arquivo original src/test/examples/testlibpq.c
# na distribuição do PostgreSQL
#
require 'postgres'
def main
pghost = nil
pgport = nil
pgoptions = nil
pgtty = nil
dbname = "template1"
login = "teste"
password = "teste"
begin
conn = PGconn.connect(pghost,pgport,pgoptions,pgtty,dbname,login,password)
if $DEBUG
fd = open("/tmp/trace.out","w")
conn.trace(fd)
end
res = conn.exec("BEGIN")
res.clear
res = conn.exec("DECLARE myportal CURSOR FOR select * from pg_database")
res.clear
res = conn.exec("FETCH ALL in myportal")
if (res.status != PGresult::TUPLES_OK)
raise PGerror,"O comando FETCH ALL não retornou as tuplas apropriadamente\n"
end
for fld in res.fields
printf("%-15s",fld)
end
printf("\n\n")
res.result.each do |tupl|
tupl.each do |fld|
printf("%-15s",fld)
end
printf("\n")
end
res = conn.exec("CLOSE myportal")
res = conn.exec("END")
res.clear
conn.close
if $DEBUG
fl.close
end
rescue PGError
if (conn.status == PGconn::CONNECTION_BAD)
printf(STDERR, "Foi perdida a conexão com o servidor de banco de dados, ")
printf(STDERR, "portanto é impossível continuar o processamento. ")
printf(STDERR, "Terminando.\n")
else
printf(STDERR, conn.error)
end
exit(1)
end
end
main
O resultado da execução, com algumas linhas e colunas suprimidas, está mostrado abaixo:
$ ./test1.rb
datname datdba encoding datistemplate datallowconn ... datacl
...
template0 1 8 true false ... {postgres=CT/postgres}
template1 1 8 true true ...
teste 161 8 false true ...
plruby 1 8 false true ...
...