Entre las cosas con que un desarrollador se encuentra a lo largo de los proyectos, es con la tarea de integrar viejas y nuevas tecnologías, para construir algo nuevo y distinto. Este puede ser el caso de quienes tienen que integrar un AS/400 con un MS SQL Server, u o bien de aquellos que se ven en la necesidad de incorporar bases de datos preexistentes y de diversos tipos para darles un tratamiento adecuado. De este modo, por ejemplo, es usual que se pretenda compartir información en bases de datos locales mediante interfaces web. Para este caso, existen herramientas de desarrollo que permiten hacerlo, como ser Java, o en mi caso en particular, Rails.
Pero no todo es color de rosas con Rails, debido principalmente a que la estructura para la gestion de bases de datos se define inicialmente en desarrollo, testing y producción, y el intentar agregar una base de datos adicional suele ser un quebradero de cabeza.
Hoy voy a mostrar como se pueden incorporar fácilmente nuevas bases de datos a nuestro proyecto Rails de modo que podamos interactuar con ellas sin problemas y de ser posible, con los beneficios que brinda un ORM como ActiveRecord. Para este ejemplo integraré una base de datos existente a un proyecto Rails. Además, utilizaré la base de datos Employee.fdb que trae de ejemplo Firebird. Lo interesante es que esta db no respeta las convenciones Rails de desarrollo, por lo que este ejemplo apunta a representar una solución para un caso real.
En principio démosle una mirada al archivo que contiene las definiciones de conexión a las bases de datos: /config/databases.yml
development: adapter: mysql encoding: utf8 reconnect: false database: testror23_development pool: 5 username: user password: socket: /var/run/mysqld/mysqld.sock # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: adapter: mysql encoding: utf8 reconnect: false database: testror23_test pool: 5 username: user password: socket: /var/run/mysqld/mysqld.sock production: adapter: mysql encoding: utf8 reconnect: false database: testror23_production pool: 5 username: user password: socket: /var/run/mysqld/mysqld.sock
YAML es un formato alternativo a XML que pretende simplificar la lectura de la información contenida. En vez de trabajar con tags como XML, YAML utiliza la indentación para estos fines.
Un error muy común al intentar conectar las db es olvidar o no respetar la indentación. Es simple, sinó se indenta no funciona.
Este archivo contiene tres tags importantes:
Cuando se inicia un nuevo proyecto Rails, estos tres items se generan de manera automática, asumiendo inclusive el tipo de adaptador. A partir de Rails 2.2 se incorpora SQLite por defecto. En el ejemplo citado tengo mysql pero fue generado por NetBeans con JRuby y Rails 2.1.
Para agregar una base de datos adicional debemos editar databases.yml y al final agregar
db_firebird: adapter: jdbc username: sysdba password: masterkey driver: org.firebirdsql.jdbc.FBDriver url: jdbc:firebirdsql:localhost/3050:employee.fdb
Aquí declaramos que el adaptador es jdbc, que el username es sysdba, la clave masterkey, que como driver usamos el Jaybird y que como url utilizamos esa suerte de encantamiento esotérico para establecer la conexión. Tanto sysdba como masterkey son los user y passwd por defecto de Firebird. Todo esto se encuentra englobado en el tag db_firebird, el cual utilizaremos para establecer la conexión.
Bien, ya tenemos definida la conexión en el yml, pero Rails por su naturaleza misma no sabrá de qué se trata hasta que se lo digamos. Para esto haremos uso a una característica de Ruby que es la herencia de objetos. Crearemos una nueva clase que herede las propiedades de la clase ActiveRecord::Base, luego le indicaremos a Rails que la clase que creamos es una clase abstracta en sí misma, de modo que no intente interpretarla como un modelo de bases de datos más ni que busque su tabla correspondiente, y finalmente estableceremos la conexión.
class Firebird < ActiveRecord::Base self.abstract_class = true establish_connection :db_firebird end
Seguidamente, creamos los modelos que representarán a las tablas de la base de datos adicional, reemplazando luego la clase a heredar.
class Employee < Firebird set_table_name "EMPLOYEE" set_primary_key "emp_no" end
Con esto ya tenemos declarada la conexión a una base de datos adicional, y podemos acceder a las funcionalidades ActiveRecord para nuestro proyecto. set_table_name le dice a Rails el nombre de la tabla, evitando que intente realizar inflexiones y pluralizaciones de nombres, y tambien le indicamos con set_primary_key la clave primaria, en este caso "emp_no".
Como limitante tenemos que no podemos establecer asociaciones entre bases de distinto tipo. Es necesario correr un proceso de migración que replique la información en nuestra db local. De todos modos y si lo que se desea es trabajar con la base de datos adicional estableciendo las asociaciones en ella misma, esto es posible. ActiveRecord falla en este punto y es necesario pensar en SQL Proxies para lograr el efecto deseado.
Que lo disfruten.
Comentarios recientes
38 weeks 4 days ago
40 weeks 2 days ago
1 año 20 weeks ago
1 año 22 weeks ago
1 año 35 weeks ago
1 año 40 weeks ago
1 año 45 weeks ago
1 año 45 weeks ago
1 año 46 weeks ago
1 año 46 weeks ago