如何通过java程序以编程方式导入mysql数据库转储文件(包含insert和create table语句)。我需要这个作为单元测试的设置阶段。
不幸的是,这不起作用:
Connection conn = dbConnectionSource.getConnection();
Statement stmt = conn.createStatement();
stmt.execute(FileUtils.readFileToString(new File("./some-sql-file")));
conn.close();
谢谢, -A
PS - 在Rails中,我使用fixture来填充测试数据库。我通过设置要测试的环境来创建底层表来创建底层表,在Java中是类似的。
答案 0 :(得分:13)
如果您可以在运行导入的任何地方访问mysql可执行文件,则可以从java启动新进程并执行此命令。像这样:
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("mysql -p -h ServerName DbName < dump.sql");
答案 1 :(得分:4)
备份:
/******************************************************/
//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”);
}
还原:
/******************************************************/
//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”);
}
答案 2 :(得分:3)
我个人不赞成以这种方式加载常规SQL转储,因为你需要非平凡的代码来解析或至少标记化SQL。
我建议使用CSV数据转储,您可以使用LOAD DATA INFILE语法加载它们。请参阅:http://dev.mysql.com/doc/refman/5.1/en/load-data.html
当然,你仍然需要确保目标表存在,但是如果你知道你只需要解析表创建DDL stattemnts,那将大大简化你的java代码。
请注意,您可以使用mysqldump从数据库中提取CSV数据,请参阅:http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_tab
答案 3 :(得分:0)