segunda-feira, 28 de setembro de 2009

Rails loves Firebird

Para fazer o Rails falar com o Firebird, levando-se em conta que o Firebird 2.1 e o Rails estão instalados.

$ sudo apt-get install firebird2.1-dev
$ sudo gem install fb
$ sudo gem install fb_adapter


O nome do adapter é 'fb'. Para criar registros, é necessário ter um generator com o nome #{table_name}_seq Não testei com migrations, então não sei se um create_table também criaria o generator.

Tentei usar o recurso de alias do Firebird e não funcionou aqui. Só com o caminho completo até o banco do Firebird.

Tanto o fb (acesso a Firebird com Ruby) quanto fb_adapter (adaptador de Firebird para Rails) estão disponíveis em http://github.com/rowland.


OBS: Caso esteja tendo problemas com o uso desta gem, leia os comentários.

3 comentários:

  1. Oi Rodrigo,

    Segui suas dicas e instalei as duas gems fb e fb_adapter.

    Porém, sempre que tento recuperar um objeto do banco recebo o seguinte erro:

    ActiveRecord::StatementInvalid: Fb::Error: Invalid token
    Dynamic SQL Error
    SQL error code = -104
    Token unknown - line 1, column 15
    "TBPROD"
    : SELECT * FROM "TBPROD" ,
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/connection_adapters/abstract_adapter.rb:221:in `log'
    from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:307:in `log'
    from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:312:in `select_all'
    from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:299:in `translate'
    from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:311:in `select_all'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:664:in `find_by_sql'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:1578:in `find_every'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:618:in `find'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:638:in `all'
    from (irb):3

    Você tem alguma sugestão?

    Obrigado.

    ResponderExcluir
  2. Olá Nielson,

    Se eu bem me lembro, estes drivers aparentemente só funcionam com o dialeto 3 do Firebird. Quando tentei usar com bancos no dialeto 1, obtive um erro semelhante ao seu.

    ResponderExcluir
  3. Em troca de e-mails, o Nielsom Rolim encontrou uma solução para o problema caso não seja possível usar um banco com o dialeto 3. Transcrevo abaixo a solução:

    --------------

    Oi Rodrigo,

    Descobri onde estava o erro.

    O problema era a formação da query SQL. O ActiveRecord adiciona aspas duplas ao nome da tabela. Isso tava causando erro no Firebird, pois ele não aceita essas aspas.

    A query SELECT * FROM TBPROD funciona, mas SELECT * FROM "TBPROD" dá o erro que falei antes.

    A solução que encontrei (não sei se é a melhor) foi editar o fb_adapter.rb (C:\Ruby\lib\ruby\gems\1.8\gems\fb_adapter-0.6.0\lib\active_record\connection_adapters\fb_adapter.rb) e alterar o método quote_column_name na classe FBAdapter.

    Mudei de:
    def quote_column_name(column_name) # :nodoc:
    #%Q("#{ar_to_fb_case(column_name.to_s)}")
    end

    Para:
    def quote_column_name(column_name) # :nodoc:
    ar_to_fb_case(column_name.to_s)
    end

    Com essa alteração resolvi o problema.

    -------------

    Agradeço ao Nielsom pelas informações. É assim que a comunidade evolui!

    ResponderExcluir