Java から MySQL にスキーマを作成する必要があるライブラリがあります。現在、mysql
コマンドにパイプするだけのスキーマのダンプがあります。これは問題なく動作しますが、次の理由から理想的ではありません。
- 脆弱です:
mysql
コマンドはパス上にある必要があります: 通常、OSX または Windows では、追加の構成なしでは機能しません。 - また、スキーマが記述的ではなくステートメントとして格納されるため、脆い
- Java はすでに mysql データベースにアクセスできるため、これを行うために外部プログラムに依存するのはばかげているように思えます。
これを行うためのより良い方法を知っている人はいますか? 多分...
- ファイルからステートメントを読み取り、Java から直接実行できますか? セミコロンの解析と手動でのステートメントの分割を伴わない方法はありますか?
- スキーマを他の方法で保存できます-構成ファイルとして、またはJavaで直接、ステートメントとしてではなく(レールのスタイル
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);