我有一个库需要从 Java 在 MySQL 中创建模式。目前,我有一个模式转储,我只是通过管道输入mysql
命令。这可以正常工作,但并不理想,因为:
- 它很脆弱:
mysql
命令需要在路径上:通常在没有额外配置的情况下在 OSX 或 Windows 上不起作用。 - 也很脆弱,因为模式存储为语句,而不是描述性的
- Java 已经可以访问 mysql 数据库,所以依赖外部程序来做这件事似乎很愚蠢。
有谁知道更好的方法来做到这一点?也许...
- 我可以从文件中读取语句并直接从 Java 执行它们吗?有没有一种不涉及解析分号和手动划分语句的方法?
- 我可以以其他方式存储模式 - 作为配置文件或直接在 Java 中,而不是作为语句(以 rails'
db:schema
或的样式database.yml
),并且有一个库可以根据该描述创建模式?
这是现有代码的片段,它可以工作(当mysql
在命令行上时):
if( db == null ) throw new Exception ("Need database name!");
String userStr = user == null ? "" : String.format("-u %s ", user);
String hostStr = host == null ? "" : String.format("-h %s ", host);
String pwStr = pw == null ? "" : String.format("-p%s ", pw);
String cmd = String.format("mysql %s %s %s %s", hostStr, userStr, pwStr, db);
System.out.println(cmd + " < schema.sql");
final Process pr = Runtime.getRuntime().exec(cmd);
new Thread() {
public void run() {
try (OutputStream stdin = pr.getOutputStream()) {
Files.copy(f, stdin);
}
catch (IOException e) { e.printStackTrace(); }
}
}.start();
new Thread() {
public void run() {
try (InputStream stdout = pr.getInputStream() ) {
ByteStreams.copy(stdout, System.out);
}
catch (IOException e) { e.printStackTrace(); }
}
}.start();
int exitVal = pr.waitFor();
if( exitVal == 0 )
System.out.println("Create db succeeded!");
else
System.out.println("Exited with error code " + exitVal);