2

Java プログラムから .sql ファイルを mysql データベースにロードするにはどうすればよいでしょうか? 自己完結型のjarファイルからSQLリソースファイルを抽出しようとしました.processBuilderで外部シェルコマンドを見つけて実行しようとしました。私はすべてを試しましたが、どれもこれを行う正しい方法とは思えません。

したがって、私が抱えている問題を確認するには、次のようにします。

任意のデータベースで mysqldump を実行します。mysqldump -uroot --routines myDB > ~/Desktop/myDB.sql

次に、このデータベース全体を java/jdbc api から再作成してみましょう。mydB.sql ファイルでこれを適切かつ正確に行うにはどうすればよいでしょうか。

データベースファイルをループする素敵なjdbcステートメントを作成すると考えるのは良いかもしれませんが、このようにダンプのセクションを取得すると、見苦しくなってしまいます

問題 1 は、例として以下に実行されます。

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `DOG`
--

DROP TABLE IF EXISTS `DOG`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `DOG` (
  `DOG_ID` mediumint(9) NOT NULL,
  `OWNER_ID` mediumint(9) NOT NULL,
  PRIMARY KEY (`DOG_ID`),
  KEY `CHANNEL_FK1` (`OWNER_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

これはjdbcの制限ですか?mysql.createDatabase(myDB.sql) のように呼び出すことができる、不足している素敵な API はありますか。

4

4 に答える 4

0

JDBC 経由で動作しない場合は、これをお勧めします。

通常、この種のタスクには ANT を使用します (mysql ダンプ ファイルの実行など)。

<exec command="mysql -u ${db.user} --password=${db.password} 
                     --database=${db.name}">
    <redirector input="${sql.file}"/>
</exec>

基本的に、コードから ant タスクを構築して呼び出すことができます (クラスに必要な ant 依存関係を追加した場合)。

于 2012-04-13T14:40:06.457 に答える
0

それが最善の方法かどうかはわかりませんが、実行時にデータベースを作成する必要がある同様のケースでうまくいった方法です:

最初に次の変数を定義します。

private static final String BASE_MYSQL_COMMAND_LINE_STR = "mysql -uUSER -pPASSWORD -h localhost < ";

「USER」と「PASSWORD」を実際のユーザー名とパスワードに置き換えるか、ハードコードしたくない場合は文字列を動的に構築してください。-u、-p と実際の値の間にスペースを入れないでください。

次の関数も定義します。

private static void executeCommandInLinuxShell(String command) throws Exception {
            String[] cmd = {"/bin/sh", "-c", command};  
            Process proc = Runtime.getRuntime().exec(cmd);
            BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line;
            while ((line = bufferedreader.readLine()) != null);
            bufferedreader.close();
            proc.waitFor();

    }

次に、プログラムに「mydB.sql」db ファイルを指す File オブジェクト「sqlFile」があるとします。

String scmd = BASE_MYSQL_COMMAND_LINE_STR + sqlFile.getAbsolutePath();
executeCommandInLinuxShell(scmd);
于 2012-04-13T15:36:40.067 に答える
0
  1. mysql コネクタがクラス パスにあることを確認します。ライブラリ、そのようにプロジェクトをビルドすると、 java -jar YourApplication.jar は lib/mysql-connector-java-5.1.13-bin.jar などを見つけるはずです。
  2. ソース コードで、ドライバーをロードします。 Class.forName("com.mysql.jdbc.Driver").newInstance();
  3. .sql ファイルをロードします。 String sql = new Scanner(new File("yourfile.sql")).useDelimiter("\Z").next();
  4. データベースに接続します: Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database",username,password);
  5. SQL を実行します: Statement st = conn.createStatement();st.execute(sql);

上記は、.sql ファイルに SQL ステートメントが含まれていることを前提としています。

于 2012-04-13T14:52:22.630 に答える
0

Flywayには高度な SQL パーサーがあり、mysql ダンプをすぐに処理できます。ユースケースに合わせて構成するのは簡単です。

于 2012-04-21T18:30:17.597 に答える