February 3, 2009

Plugin para usar esquemas do PostgreSQL com JRuby

Filed under: postgresql, rails — coutinho @ 2:11 am

Se alguém aqui já teve que fazer uma aplicação razoavelmente grande com rails e PostgreSQL, ou se mesmo sem a aplicação ser muito grande teve necessidade usar os “esquemas” do postgresql, viu que o rails, mesmo com o ruby, tem alguma dificuldade para trabalhar com eles.

Usando rails 1.x você podia usar algo como:

set_table_name “financeiro.pagamentos”

Já usando o rails 2.x isso gera um erro nas consultas no postgresql pois em um find normal a consulta é montada assim:

select * from “financeiro.pagamentos”

ao invés de

select * from “financeiro”.“pagamentos”

No rails 2 você consegue usar tabelas em vários esquemas desde que eles estejam no search_path, o que nem sempre é viável em algumas aplicações, sem contar que isso não funciona para a operações onde se precisa ler os metadados da tabela, uma vez que é necessário pesquisar os metadados no PostgreSQL usando o nome da tabela e o nome do esquema.

O bom é que a gente quase não usa consultas de metadados.
O ruim é que no Jruby elas são executadas a todo momento, pois o driver JDBC precisa saber os tipos de cada coluna para montar o result set e retornar para a aplicação cliente. Assim uma aplicação rails que acessa tabelas em diferentes esquemas ao ser migrada para de ruby para jruby simplesmente para de funcionar.

A solução que encontrei para isso foi criar um plugin através do qual eu tenho um metodo set_schema_name, semelhante ao set_table_name, assim eu posso especificar o nome do esquema onde está a tabela. Esse plugin pode ser usado também nso migrates para definir o esquema onde você está executando seus migrates.

Veja abaixo como é facil:

class CreatePagamento < ActiveRecord::Migration
set_schema_name :financeiro
def self.up

end

class Pagamento < activeRecord::Base
acts_as_schema_support
set_schema_name :financeiro
end

Por enquanto o plugin é só para JRuby, mas em breve vou fazer ele funcionar no Ruby também.

Aproveitei para ver como funciona o github e publiquei o plugin lá:
http://github.com/mondrian/acts_as_schema_support

Dúvidas, críticas e sugetões, enviem e-mail pra mim: coutinho em mondriantecnologia.com

4 Comments »

  1. [...] http://coutinho.mondriantecnologia.com/archives/55 [...]

    Pingback by Plugin para usar esquemas do PostgreSQL com JRuby - DbRunas — February 3, 2009 @ 9:27 pm

  2. Interessante, vi poucas coisas em JRuby apesar de ouvir falar muito bem. Parabéns. :)

    Comment by Fernando Ike — February 4, 2009 @ 5:57 pm

  3. Maybe you can contact Jeremy Kemper from 37signals to integrate your solution. He knows this problem. See http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used

    Comment by Schuster — March 8, 2009 @ 2:16 pm

  4. Hello Schuster, thanks for the tip. ;)

    Comment by coutinho — March 9, 2009 @ 3:16 am

RSS feed for comments on this post. TrackBack URI

Leave a comment