2009-12-23 15 views
12

¿Cómo puedo importar un archivo de volcado de base de datos mysql (contiene insertar y crear instrucciones de tabla) mediante programación a través de un programa java. Necesito esto como la fase de configuración de una prueba unitaria.Importación de un volcado de base de datos (mysql) mediante programación mediante Java

Desafortunadamente esto no funciona:

Connection conn = dbConnectionSource.getConnection(); 
Statement stmt = conn.createStatement(); 
stmt.execute(FileUtils.readFileToString(new File("./some-sql-file"))); 
conn.close(); 

Gracias, -A

PS - En Rails, solía accesorios para el llenado de una base de datos de prueba. Hice que los rieles de rieles crean las tablas subyacentes mediante la configuración del entorno para probar, algo similar en Java.

+1

"pragmáticamente" debe ser "programáticamente" –

Respuesta

10

usted podría comenzar un nuevo proceso de java y ejecutar este comando si tiene acceso al ejecutable mysql donde se está ejecutando el importar. Algo como esto:

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("mysql -p -h ServerName DbName < dump.sql"); 
+0

Esta es la forma * correcta * de hacerlo. Cualquier otra forma puede fallar al trabajar en casos de borde sutiles. Los volcados Mysql están escritos para ser importados con el cliente mysql, no con ninguna otra herramienta. – MarkR

+1

Solo una corrección, no podemos usar una redirección como esa en java: Process pr = rt.exec (new String [] {"/ bin/bash", "- c", "mysql -p -h ServerName DbName

+1

alguna idea sobre cómo hacer esto en Windows? –

2

Personalmente, no recomendaría cargar un volcado de SQL regular de esta manera, ya que necesitaría un código no trivial para analizar o al menos para convertir SQL.

Recomendaría usar los volcados de datos CSV, puede cargarlos con la sintaxis LOAD DATA INFILE. Ver: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

Por supuesto, aún necesitarás asegurarte de que existan las tablas de destino, pero si sabes que solo tienes que analizar la creación de tabla de los estatutos DDL, eso simplificará drásticamente tu código java.

Tenga en cuenta que puede usar mysqldump para extraer datos CSV desde su base de datos, ver: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_tab

2

de copia de seguridad:

/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = “dbName”; 
String dbUser = “dbUser”; 
String dbPass = “dbPass”; 

/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = “”; 
executeCmd = “mysqldump -u “+dbUser+” -p”+dbPass+” “+dbName+” -r backup.sql”; 
} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 

out.println(“Backup taken successfully”); 

} else { 

out.println(“Could not take mysql backup”); 

} 

Restaurar:

/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = “dbName”; 
String dbUser = “dbUser”; 
String dbPass = “dbPass”; 

/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = “”; 

executeCmd = new String[]{“/bin/sh”, “-c”, “mysql -u” + dbUser+ ” -p”+dbPass+” ” + dbName+ ” < backup.sql” }; 

} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 

out.println(“success”); 

} else { 

out.println(“restore failure”); 

} 
Cuestiones relacionadas