Fullmenu null

 

31 August 2017

A veces nos surge que tenemos que extraer los datos de una base de datos e insertarlas en otra base de datos (o tabla). Si simplemente fuera una extracción y una carga tu motor de datos probablemente incluya alguna herramienta import/export, pero si tienes que realizar alguna transformación en los registros la cosa ya se complica.

Además realizar un insert por cada registro probablemente no sea la forma más óptima de cargar los datos pues cada insert realiza una transacción con su consiguiente coste.

Mediante este script vamos a leer los datos de una tabla, realizar una transformación a un campo e insertar los registros en modo batch

Fijate que el número de registros a incluir en cada batch se puede indicar de una forma simple mediante un argumento en la llamada withBatch

@Grab('mysql:mysql-connector-java:5.1.6')(1)
@GrabConfig(systemClassLoader=true)
import groovy.sql.Sql

def sql_orig = Sql.newInstance( "jdbc:mysql://localhost:3306/origen?jdbcCompliantTruncation=false", "user", "password", "com.mysql.jdbc.Driver")(2)
def sql_dest =  Sql.newInstance( "jdbc:mysql://localhost:3306/destino?jdbcCompliantTruncation=false", "user", "password", "com.mysql.jdbc.Driver")

batchSize=20

sql_dest.withBatch( batchSize, "insert into TABLE_DESTINO(a,b,c) values(?,?,?)"){ ps->   (3)

   sql_orig.eachRow"select a,b,c from TABLE_ORIGEN",{ row ->   (4)

	row.a = row.a.toUpperCase().reverse()  (5)

	ps.addBatch(row) (6)
   }
}
(7)
1 Usamos Grape para cargar las dependencias
2 Definimos la conexión con las bases de datos.
3 Preparamos un insert en modo batch de batchSize elementos
4 Leemos la tabla origen. Podemos usar sort, where, etc
5 Hacemos nuestra transformacion de negocio, por ejemplo, pasar a mayuscula y revertir la cadena
6 Vamos insertando en el batch. Cada batchSize elementos la closure los volcara en la bbdd
7 Al finalizar la lectura todas las closures realizan el cerrado de recursos

Script
@Grab('mysql:mysql-connector-java:5.1.6')(1)
@GrabConfig(systemClassLoader=true)
import groovy.sql.Sql

def sql_orig = Sql.newInstance( "jdbc:mysql://localhost:3306/origen?jdbcCompliantTruncation=false", "user", "password", "com.mysql.jdbc.Driver")(2)
def sql_dest =  Sql.newInstance( "jdbc:mysql://localhost:3306/destino?jdbcCompliantTruncation=false", "user", "password", "com.mysql.jdbc.Driver")

batchSize=20

sql_dest.withBatch( batchSize, "insert into TABLE_DESTINO(a,b,c) values(?,?,?)"){ ps->   (3)

   sql_orig.eachRow"select a,b,c from TABLE_ORIGEN",{ row ->   (4)

	row.a = row.a.toUpperCase().reverse()  (5)

	ps.addBatch(row) (6)
   }
}
(7)