2016-07-29 194 views
3

我目前使用mysql作爲我的數據庫並使用flyway來管理數據庫模式。我所有的單元測試都針對mysql運行,並且在添加更多單元測試時運行速度非常慢。現在我想在單元測試中將數據庫從mysql更改爲h2內存數據庫。以下是我的h2 db連接設置:如何使mysql數據庫模式與h2數據庫兼容

#Datasource 
spring.datasource.url=jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=true 
spring.datasource.username= 
spring.datasource.password= 
spring.datasource.driver-class-name=org.h2.Driver 
spring.datasource.default-transaction-isolation-level=1 

當我運行flywayMigrate時,出現了一些sql錯誤。下面是一個例子,這個sql用於在mysql上創建一個表,但是無法在h2上運行。

CREATE TABLE `file_storage` (
    `id` BIGINT(64) NOT NULL AUTO_INCREMENT, 
    `file_name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`)) 
DEFAULT CHARACTER SET = utf8; 

下面是我從h2得到的錯誤。我不知道我的SQL有什麼問題。有沒有辦法讓h2接受mysql數據庫模式?

Execution failed for task ':dbschema:flywayMigrate'. 
> Error occurred while executing flywayMigrate 

    Migration V2016_02_26_12_59__create_file_storage.sql failed 
    ----------------------------------------------------------- 
    SQL State : 42000 
    Error Code : 42000 
    Message : Syntax error in SQL statement "CREATE TABLE ""FILE_STORAGE"" (
    ""ID"" BIGINT(64) NOT NULL AUTO_INCREMENT, 
    ""FILE_NAME"" VARCHAR(45) NULL, 
    PRIMARY KEY (""ID"")) 
    DEFAULT CHARACTER[*] SET = UTF8 "; SQL statement: 
    CREATE TABLE `file_storage` (
    `id` BIGINT(64) NOT NULL AUTO_INCREMENT, 
    `file_name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`)) 
    DEFAULT CHARACTER SET = utf8 [42000-190] 
    Location : db/migration/V2016_02_26_12_59__create_file_storage.sql (/Users/yzzhao/dev/cooltoo/cooltoo_backend/dbschema/build/resources/main/db/migration/V2016_02_26_12_59__create_file_storage.sql) 
    Line  : 1 
    Statement : CREATE TABLE `file_storage` (
    `id` BIGINT(64) NOT NULL AUTO_INCREMENT, 
    `file_name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`)) 
    DEFAULT CHARACTER SET = utf8 

    Syntax error in SQL statement "CREATE TABLE ""FILE_STORAGE"" (
    ""ID"" BIGINT(64) NOT NULL AUTO_INCREMENT, 
    ""FILE_NAME"" VARCHAR(45) NULL, 
    PRIMARY KEY (""ID"")) 
    DEFAULT CHARACTER[*] SET = UTF8 "; SQL statement: 
    CREATE TABLE `file_storage` (
    `id` BIGINT(64) NOT NULL AUTO_INCREMENT, 
    `file_name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`)) 
    DEFAULT CHARACTER SET = utf8 [42000-190] 

編輯

我有上百個SQL腳本這是在mysql中運行良好。所以我不想在這些腳本中改變任何東西。有沒有辦法讓h2接受mysql腳本?

+0

替換或刪除';或嘗試http://topnew.net/sidu單擊表desc,然後複製過去創建表SQL,不需要'當不需要時 – SIDU

+0

我試圖刪除所有'但SQL'中的'語法錯誤'錯誤。我有超過一百個sql腳本,我不想一個接一個地改變它們。所有這些sql在mysql中工作良好。所以我徘徊是否有辦法配置h2 db來接受這些語法。 –

回答

1

根據this說明,您可以嘗試在MySQL兼容模式下使用H2數據庫,方法是在連接字符串中將其設置爲MODE=MySQL。這裏到底是什麼說一下吧:

使用MySQL模式,使用數據庫URL jdbc:h2:~/test;MODE=MySQL或SQL語句SET MODE MySQL

  • 當插入數據,如果列被定義爲NOT NULLNULL被插入,則0(或空字符串,或者爲時間戳列當前時間戳)被使用的值。通常,這個操作是不允許的,並且拋出一個異常。

  • 使用INDEX(..)KEY(..)可以在CREATE TABLE語句中創建索引。示例:create table test(id int primary key, name varchar(255), key idx_name(name));

  • 元數據調用以小寫形式返回標識符。

  • 將浮點數轉換爲整數時,小數位不會被截斷,但會舍入該值。

  • 用另一個值連接NULL會產生另一個值。

默認情況下,MySQL中的文本比較不區分大小寫,而在H2中區分大小寫(與大多數其他數據庫一樣)。 H2支持不區分大小寫的文本比較,但需要分別設置,使用SET IGNORECASE TRUE。這會影響使用=,LIKE,REGEXP的比較。

+0

在描述中它看起來不錯。根據我的經驗,如果沒有重新工作,這是行不通的 –

1

您的問題可以用你的榜樣

CREATE TABLE `file_storage` 
(
    'id` BIGINT(64) NOT NULL AUTO_INCREMENT, 
    `file_name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`) 
) 
DEFAULT CHARACTER SET = utf8; 

最後一行的「默認字符集= UTF8」樹立了一個MySQL表選項中可以看出。H2在表或模式級別沒有這樣的選項,因爲它始終使用Unicode進行操作。

如果你有很多年來爲MySQL編寫的SQL DDL語句,你很可能會看到很多這樣的問題。