Как загрузить дамп mysql в базу данных hsqldb? - PullRequest
14 голосов
/ 28 сентября 2010

У меня есть файл sql, который создает базу данных в MySQL:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`machine`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`machine` (
  `id` INT NOT NULL ,
  `name` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) );


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Теперь я хотел бы загрузить этот файл в базу данных hsqldb 2. Что мне нужно изменить в дампе mysql для загрузки данных в hsqldb?

В настоящее время я использую этот код (groovy) для выполнения файла sql:

def embeddedDbSettings = [url:'jdbc:hsqldb:file:mydb', user:'sa', password:'', driver:'org.hsqldb.jdbcDriver'];
sql =  Sql.newInstance(embeddedDb);
sql.executeInsert new File("./sql/create_database.sql").text;

и все время я получал это зашифрованное исключение:

Exception in thread "main" java.sql.SQLException: unknown token
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
    at groovy.sql.Sql.executeInsert(Sql.java:1440)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:229)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at de.hpi.ecir.eval_script.Convert2Excel.main(Convert2Excel.groovy:37)
Caused by: org.hsqldb.HsqlException: unknown token
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.ParserBase.read(Unknown Source)
    at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
    at org.hsqldb.Session.executeDirectStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 13 more

Ответы [ 5 ]

13 голосов
/ 28 сентября 2010
  1. Удалить все строки SET
  2. Изменить строку с командой, которая создает базу данных, на: CREATE SCHEMA mydb AUTHORIZATION DBA
  3. Удалить все if not exists - hsqldb не поддерживает эту команду
  4. Удалить все комментарии (не необходимые, но необходимые для кода, который вы найдете в этом посте)
  5. Удалить все `
  6. Заменить TINYINT (аналог mysql для логического) на логическое
  7. Выполнить каждую команду отдельно:

    String[] commands = new File("./sql/create_database.sql").text.split(";");
    
    for(String command: commands)
    {
    
     // new line is a delimiter in hsqldb
    
      sql.execute command.replace("\n", " ");
    }
    
    // remember to call shutdown otherwise hsqldb will not save your data
    sql.execute "SHUTDOWN"
    sql.close();
    
7 голосов
/ 17 октября 2011

Вы также должны:

  • заменить «AUTO_INCREMENT» в CREATE_TABLE на «GENERATED DEFAULT AS IDENTITY»
  • заменить «int» на «integer»
  • переместите оператор "default" при создании столбца, например:

из этого:

CT_CLIENT integer NOT NULL DEFAULT '0',

в следующее:

CT_CLIENT integer DEFAULT '0' NOT NULL ,
0 голосов
/ 25 октября 2015

Я решил эту проблему, полагаясь на RazorSQL .Это не бесплатно, но с ознакомительной версией вам достаточно для выполнения преобразования из MySQL в HSQLDB.Он также поддерживает другие преобразования БД.

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

CREATE TABLE items_fractions (
  id INTEGER IDENTITY NOT NULL,
  item_id INTEGER NOT NULL,
  fraction_id INTEGER NOT NULL,
  PRIMARY KEY (id)
);

Мне пришлось удалить бит IDENTITY.

0 голосов
/ 27 февраля 2015

Решил эту проблему, используя IntelliJ IDEA:

  1. На вкладке базы данных добавьте соединение с базой данных (в данном случае MySQL)
  2. Щелкните правой кнопкой мыши нужную базу данных и выберитена "Копировать DDL".
0 голосов
/ 24 августа 2011

Вам не нужно запускать каждую команду отдельно, hsqldb прекрасно работает, если вы запускаете все сценарии одновременно, если все ваши токены действительны.

...