domingo, 28 de septiembre de 2014

Inicializar la base de datos con un fichero CSV

Uno de los problemas que nos solemos encontrar cuando comenzamos a desarrollar una aplicación, por pequeña que sea, es que necesitamos un conjunto mínimo de datos para trabajar.


Una primera aproximación es aprovechar las características de scaffolding de grails para que, cuando iniciamos la aplicación, introducir estos datos de manera manual a través de los formularios de alta. Pero está claro que esto no es lo que buscamos.

Empecemos por el principio. Supongamos que para nuestra aplicación creamos una clase de dominio para encapsular los datos de personas:


// File: grails-app/domain/test/Person.groovy
package test

class Person {
    String firstName
    String lastName
    int age
}



La solución suele pasar por añadir código al método init() de la clase BootStrap de la aplicación, creando instancias de la clase Person y guardándolas en la base de datos. Esto lo haremos creando el método loadPersonData() en la clase y llamándolo desde init:


// File: grails-app/conf/BootStrap.groovy
import test.Person

class BootStrap {
    def init = { servletContext ->
        environments {
            development {
                if (Person.count() == 0) {
                    loadPersonData()
                }
            }
        }
    }

    def destroy = {
    }

    def loadPersonData() {
        new Person(firstName: 'Albert', lastName: 'Willis', age: 35).save(flush: true)
        new Person(firstName: 'Stephen', lastName: 'West', age: 38).save(flush: true)
        new Person(firstName: 'Raymond', lastName: 'Chavez', age: 32).save(flush: true)
        new Person(firstName: 'Melissa', lastName: 'Rose', age: 25).save(flush: true)
        new Person(firstName: 'Jane', lastName: 'Woods', age: 36).save(flush: true)
        new Person(firstName: 'Michelle', lastName: 'Hansen', age: 33).save(flush: true)
        new Person(firstName: 'Judith', lastName: 'Stewart', age: 28).save(flush: true)
        new Person(firstName: 'Jerry', lastName: 'Carpenter', age: 36).save(flush: true)
        new Person(firstName: 'Debra', lastName: 'Hanson', age: 34).save(flush: true)
        new Person(firstName: 'Larry', lastName: 'Foster', age: 36).save(flush: true)
    }
}


Esta solución nos obliga a copiar los datos dentro del código, lo que puede no interesarnos. Una mejora que haría nuestro código más elegante sería tener un fichero con los datos, por ejemplo, un fichero CSV.


Para continuar, crearemos dentro del directorio "conf/" de nuestro proyecto, un subdirectorio al que llamaremos "resources". Dentro de éste crearemos un fichero "data.csv" con un contenido similar al siguiente:

Albert,Willis,35
Stephen,West,38
Raymond,Chavez,32
Melissa,Rose,25
Jane,Woods,36
Michelle,Hansen,33
Judith,Stewart,28
Jerry,Carpenter,36
Debra,Hanson,34
Larry,Foster,36


De esta forma tendremos los datos que queremos cargar durante el arranque de la aplicación separados del código. Para cargar este fichero, lo primero que tendremos que hacer es añadir a la configuración de la aplicación el plugin CSV para poder tratar ficheros en formato CSV. Esto lo haremos modificando el fichero "conf/BuildConfig.groovy" añadiendo el siguiente código:

// grails-app/conf/BuildConfig.groovy
...
plugins {
    ...
    compile ":csv:0.3.1" 
    ...
}
...

Una vez hecho esto, tendremos que modificar el procedimiento de inicio para que genere las instancias de la clase Person a partir de los datos del fichero CSV. Esto nos obligará a modificar el método loadPersonData. Este método cargará el fichero CSV y por cada registro creará una instancia Person y la guardará en la base de datos.
// File: grails-app/conf/BootStrap.groovy
...
        def loadPersonData() {
            grailsApplication.getParentContext().getResource("classpath:resources/data.csv").inputStream.toCsvReader(['charset':'UTF-8','separatorChar':',']).eachLine { tokens ->
                new Person(firstName: tokens[1], lastName: tokens[2], age: tokens[3]).save(flush: true)
            }
        }
...

Con estos cambios cada vez que se inicie la aplicación cargará los datos del fichero CSV creado.



En una próxima entrada veremos como inicializar la base de datos con un fichero SQL

martes, 2 de septiembre de 2014

Comenzando el curso de jPassion.com

Bueno, pues ya estamos aquí, de nuevo. En este tiempo, entre otras muchas cosas, me he dedicado a buscar algún curso que me permitiera comenzar en el mundo GRAILS (y Groovy) de una manera sencilla.

Sí, ya sé que está el Getting Started, pero bueno, Nunca está de más apoyarte en un curso con un contenido más o menos definido. Así que la semana pasada me decidí, al fin, por registrarme en los cursos de jPassion.com.

Esta web contiene un conjunto de cursos, la mayoría relacionados con el mundo Java, creados e impartidos por un antiguo "evangelizador" de Sun y Java: Sang Shin. Por una subscripción anual, a un precio muy competitivo, tienes acceso a todos los cursos, que van desde una iniciación al java hasta java avanzado o un curso dedicado a la monitorización. También trata frameworks como Spring o Hibernate. Y ya os he hablado de Grails.

Cada curso está dividido en diversas unidades. De cada unidad, los usuarios registrados tienen disponible:
  • Una presentación en formato PDF
  • Un laboratorio, con ejercicios y deberes que el alumno debe hacer por su cuenta
  • Un screencast en el que el propio Sang Shin explica la presentación

En las próximas semanas intentaré ir subiendo aquí algunas ideas y/o trucos que me parezcan interesantes, aunque no podré subir los contenidos del curso, ya que la licencia lo impide.

lunes, 20 de enero de 2014

Bienvenidos a Aprendiendo GRAILS

Hola!

Esta es la primera entrada de mi nuevo blog. Desde hace semanas he comenzado a interesarme por GRAILS como framework de desarrollo de aplicaciones web

A partir de ahora intentaré recoger en este blog aquellas ideas que me vayan surgiendo, referencias a tutoriales, guías, páginas, etc que encuentre interesantes o sobre plugins que vaya utilizando. Además de servir de recopilación de recursos para desarrollo en GRAILS.

Así que si os interesa el tema, espero poder ofreceros contenidos que os puedan servir

Gracias
 
Powered by Blogger
Blogger Templates