martes, 4 de junio de 2013

Configurando un archivo sql para cargarse con el BootStrap de Grails


Muchas de las veces necesitamos meter información a la base de datos ya sea para llenar los catálogos o bien para cargar información de prueba que nos ahorra tener que seguir procesos simples pero repetitivos, el caso más común los insert hacia la base.

En este pequeño tutorial vamos a definir un archivo .sql y aprenderemos como invocarlo desde el bootstrap de grails para que se ejecute cuando termine de arrancar nuestra aplicación y meta datos a la BD. Lo primero que deberemos de hacer es crear un directorio debajo de “conf” al que llamaremos “sql” y dentro de este directorio un archivo llamado “catalogos.sql”.




Dentro de ese archivo vamos a poner las sentencias sql que necesitamos se carguen justo al levantar nuestra aplicación por ejemplo supongamos que yo tengo un dominio llamado Categoría y tiene la siguiente estructura:
 

class Categoria {

   static hasMany = [productos:Producto]

   String nombre


   static constrain={}

}

Y quiero que se carguen por default 3 categorías entonces los insert en mi archivo catalogos.sql quedarían de la siguiente manera: 

 
insert into categoria (id, version, nombre) values (1, 0, 'Pañales'); 

insert into categoria (id, version, nombre) values (2, 0, 'Pañaleros'); 

insert into categoria (id, version, nombre) values (3, 0, 'Zapatos'); 

Con esto ya tenemos un dominio y los datos a cargarse ahora veremos qué es lo que realmente hace la magia, en el archivo BootStrap.groovy vamos a agregar la siguiente función:

 
def loadSqlData(archivo) {
        
        try {
            def is = grailsApplication.mainContext.getResource("classpath:sql/${archivo}.sql").inputStream
            def db = new Sql(dataSource)
            log.debug "::::::::: Carga ${archivo}... 0% :::::::::"        
            is.eachLine { line ->
                if (line.trim().empty) {
                    log.debug 'línea en blanco omitida'
                } else {
                    log.debug line
                    db.executeUpdate(line)
                }
            }                    
            log.debug "::::::::: Carga ${archivo}... 100% :::::::::"
        } catch (ex) {
            log.warn ex
        }
    }



Ahora dentro del bloque init del mismo archivo que es el que se ejecuta justo cuando cargo la aplicación simplemente invocamos la función pasándole como parámetro el nombre del archivo sql que queremos cargar sin la extensión.

 
loadSqlData('catalogos')


Para comprobar que se realizo la carga podemos ir directamente a la base de datos y verificar que efectivamente los registros están ahí.


No hay comentarios:

Publicar un comentario