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