Копирование определенных таблиц базы данных MySQL в базу данных MariaDB в JDBC - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь создать программу на Java, которая копирует конкретные таблицы из базы данных MySQL на одном сервере в MariaDB на другом. Я знаю, что есть mysqldump, но цель программы - работать на разных машинах, даже если они не установлены на mysql.

То, что я создал, похоже, работает хорошо, так как полученный SQL выглядит правильно и выполняется, например, когда я подключаюсь к MariaDB с HeidiSQL. Но когда я выполняю sql, используя .executeQuery, я получаю сообщение об ошибке, что есть проблема с моим SQL.

Код в основном:

        import java.sql.*

        public class JdbcTest {     
        Connection conn = null;
        Connection conn_2 = null;
        Statement stmt = null;
        Statement stmt_2 = null;

        //MySQL
        Class.forName("com.mysql.cj.jdbc.Driver");
        //MariaDB
        Class.forName("org.mariadb.jdbc.Driver");

        System.out.println("Connecting to DB1");
        conn = DriverManager.getConnection(jdbc:mysql://server1/database,USER,PASS);

        System.out.println("Connecting to DB2");
        conn_2 = DriverManager.getConnection(jdbc:mariadb://server2/database,USER_2,PASS_2);

        List<String> ConnToTableNames = new ArrayList<String>();
        ConnToTableNames.add("table1");
        ConnToTableNames.add("table2");

        //Create queries for all tables in ConnToTableNames
        stmt = conn.createStatement();
        String exportSql = "";
        for(String table : ConnToTableNames) {
            //getting table structure
            exportSql += "\n" +
                    "-- ----------------------------\n" +
                    "-- Table structure for `" + table+
                    "`\n-- ----------------------------\n"+
                    "DROP TABLE IF EXISTS `"+table+"`;\n";
            ResultSet rs2 = stmt.executeQuery("SHOW CREATE TABLE `" + table + "`");
            rs2.next();
            exportSql += rs2.getString(2) + ";\n" +
                    "-- ----------------------------\n";
            rs2.close();

            //adding the content
            ResultSet rss = stmt.executeQuery("select * from "+table);
            while (rss.next()) {
                int colCount = rss.getMetaData().getColumnCount();
                if (colCount > 0) {
                    exportSql += "INSERT INTO `" + table +"` VALUES(";

                    for (int i = 0; i < colCount; i++) {
                        if (i > 0) {
                        exportSql += ",";
                        }
                            String s = "";
                        try {
                            s += "'";
                            s += rss.getObject(i + 1).toString();
                            s += "'";
                        } catch (Exception e) {
                            s = "NULL";
                        }
                        exportSql += s;
                    }
                    exportSql += ");\n";
                }
            }
            rss.close();
        }

        //putting everything into the VM
        stmt_2 = conn_2.createStatement();
        stmt_2.executeQuery(exportSql);

        stmt.close();
        conn.close();
        stmt_2.close();
        conn_2.close();
        }

и ошибка, которую я получаю:

java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CREATE TABLE `supplier` (
  `NUMMER` int(10) NOT NULL DEFAULT '0',
  `PRIO` int(' at line 5

Что меня действительно смущает, так это: если я дам дамп exportSql в терминал или файл и выполню его через HeidiSQL, он будет работать ...

А идеи, что я сделал не так?

Заранее спасибо и хороших выходных

1 Ответ

0 голосов
/ 30 июня 2018

Чтобы решить мою проблему, я добавил ?allowMultiQueries=true в строку подключения и использовал execute () вместо executeQuery ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...