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 ... ...