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
3 comentarios:
Gracias por tu artículo, me ha parecido muy instructivo, pero me ha generado una duda:
Imagina que despliego la app sin datos, juego un poco generando un conjunto de datos y antes de parar la app que está en memoria (H2 pro ejemplo) quiero salvar los datos para volver a cargarlos por csv tal y como has explicado.
Cual sería la forma más recomendable de hacer el export de estos datos de prueba generados? Existe alguna forma dentro de grails que lo permita o ya depende de cada BD?
Si usas H2 puedes conectarte a la consola mientras la aplicación se está ejecutando. La URL sería (por ejemplo): http://localhost:8080/myApp/dbconsole/
Si escribes "HELP" en la ventana de entrada te aparecerá una lista con todos los comandos disponibles. Allí encontrarás alguno que te permita volcar la base de datos a un fichero.
Si usas otra base de datos tendrás que utiilizar las herramientas propias. Por ejemplo, en caso de MySQL puedes usar el PhpMyAdmin para exportar la base de datos completa (estructura y datos).
Saludos y gracias por el recibimiento
Gracias y menuda celeridad!
Publicar un comentario