Para comprender correctamente todo lo que hablaremos en esta serie, es conveniente tener un conocimiento básico sobre el lenguaje de Ruby. Podrás conseguir toda la información desees aquí
Acceso a Datos.
Cuando realizamos aplicaciones web, el acceso a datos (base de datos) es algo necesario para crear una aplicación dinámica. En Sinatra podemos realizar el acceso a datos de muchas maneras pero nosotros explicaremos como se realiza utilizando DataMapper y SQLite para la serie Sinatra desde Cero.
¿Qué es DataMapper?
DataMapper es una gema que nos provee un API para definir modelos, asociaciones, crear tablas, migraciones, y realizar consultas a la base de datos entre otras cosas. Esta gema no está incluida en Sinatra ni es obligatoria para realizar lo antes descrito, pudiésemos perfectamente utilizar ActiveRecord que viene incluida por defecto en el framework de Ruby on Rails en nuestros proyectos de Sinatra, o la gema Sequel para realizar la misma tarea.
¿Como se instala?
Para instalar DataMapper tenemos dos opciones:
- La primera es incluirla en el Gemfile:
1 gem'data_mapper'
Y luego correr el comando bundle install
.
- La segunda es instalarla manualmente por la linea de comando:
1 $gem install data_mapper
Una vez que tengamos instalada la gema debemos instalar la librería de comunicación (adapters) con la base de datos de nuestra preferencia. Pueden ser Mysql, SQLite o Postgres. Nosotros utilizaremos SQLite en este curso, por lo que las instrucciones serán para este. El resto de las librerías de comunicación se pueden ver aquí.
Primero debemos instalar SQLite en nuestro equipo.
Para Ubuntu o Debian
$ sudo apt-get install libsqlite3-dev1 $sudo apt-get install libsqlite3-dev
Para OS X mediante Hombrew.
$ brew install sqlite1 $brew install sqlite
Luego de que la tenemos instalada debemos instalar la librería de comunicación entre DataMapper y SQLite:
$ gem install dm-sqlite-adapter1 $gem install dm-sqlite-adapter
O realizamos lo propio mediante el Gemfile.
Una vez que hayamos completado dichas tareas podremos comenzar a usar DataMapper.
¿Cómo se usa?
Primero debemos definir la ruta a nuestra base de datos ya sea por una variable de ambiente o en nuestra aplicación directamente. Para este curso vamos a utilizar la consola interactiva de Ruby irb
, pero puedes copiar todo esto dentro de un archivo .rb
donde funcionará de la misma manera; Luego vamos a realizar un require
de DataMapper y definir una base de datos SQLite en memoria.
Abrimos la consola interactiva de Ruby:
$ irb1 $irb
require 'data_mapper' DataMapper.setup(:default, 'sqlite::memory:')Todos los comandos a partir de este momento se ejecutan dentro de
irb
.
12 require'data_mapper'DataMappersetup(:default,'sqlite::memory:')
En este momento podemos efectivamente crear cualquier modelo de base de datos y comenzar a trabajar en el.
Nosotros crearemos un modelo Usuario con los siguientes atributos, id, email, nombre, fecha_de_creacion. Para esto debemos definir una clase que contiene los campos de la base de datos como propiedades en conjunto con su tipo de dato.
class User include DataMapper::Resource property :id, Serial property :email, String property :nombre, String property :created_at, DateTime end12345678 classUser include DataMapper::Resource property:id,Serial property:email,String property:nombre,String property:created_at,DateTimeend
Una vez que tengamos nuestro modelo listo debemos llamar DataMapper.finalize
esta llamada nos permite decirle a nuestra aplicación que hemos establecido correctamente la base de datos y ya puede acceder a ella. Esta llamada al API debe realizarse justo antes de empezar a acceder a la data cuando en teoría hemos establecido un modelo de datos “final” o “definitivo”. Es a decisión del programador elegir el momento correcto para realizar la llamada a este método.
Luego debemos realizar las famosas sentencias para crear las tablas en la base de datos y DataMapper nos entrega el siguiente comando: DataMapper.auto_migrate!
que se encarga de crear la base de datos o realizarle un drop si la misma ya existe y es en este punto cuando la base de datos está creada y lista para ser usada por nosotros.
Vamos a crear 2 usuarios para demostrar que agrega correctamente y luego vamos a realizar un par de queries en la misma.
Vamos a crear un usuario usando el método create y el segundo usuario con el método new y save que vienen siendo lo mismo que el create pero en dos pasos.
@user = User.create(email: "[email protected]", nombre: "alberto", created_at: Time.now) @user2 = User.new(email: "[email protected]", nombre: "jonathan", created_at: Time.now) @user2.save123 @user=Usercreate(email:"[email protected]",nombre:"alberto",created_at:Timenow)@user2=Usernew(email:"[email protected]",nombre:"jonathan",created_at:Timenow)@user2save
Ahora pueden probar que los elementos realmente están creados haciendo el siguiente query que retorna todos los usuarios en base de datos:
@users = User.all1 @users=Userall
Debería retornar lo siguiente:
[#<User @id=1 @email="[email protected]" @nombre="alberto" @created_at=#<DateTime: 2014-01-08T23:07:39-04:30 ((2456667j,13059s,0n),-16200s,2299161j)>>, #<User @id=2 @email="[email protected]" @nombre="jonathan" @created_at=#<DateTime: 2014-01-08T23:07:46-04:30 ((2456667j,13066s,0n),-16200s,2299161j)>>]
Si ahora quisiéramos buscar el usuario con id = 2
debemos realizar el siguiente query:
1 @u=Userget(2)
Debería retornar:
#<User @id=2 @email="[email protected]" @nombre="jonathan" @created_at=#<DateTime: 2014-01-08T23:12:37-04:30 ((2456667j,13357s,0n),-16200s,2299161j)>>
Cómo pueden observar por lo que hemos realizado hasta los momentos, DataMapper es bastante sencillo de utilizar y muy práctico para casi cualquier tarea.
Por último existe una opción de DataMapper que nos permite actualizar nuestro modelo de base de datos automáticamente. Esto nos permite agregar nuevo campo o columna a nuestra base de datos sin modificar las actuales DataMapper.auto_upgrade!
.
Conclusión
En este décimo capítulo, hemos visto de manera muy básica y usando SQLite como se usa la gema DataMapper para crear un modelo, agregarle información y posteriormente consultarla. Aún no hemos visto como unir esto con Sinatra, pero lo haremos en los próximos capítulos. Si te surge algún tipo de duda no te detengas y déjanos un comentario, que gustosamente lo responderemos.
¡Hasta el próximo capítulo!